-Fixed ReadAsBytes with type name handling

This commit is contained in:
James Newton-King
2016-01-08 22:37:05 +13:00
parent 2c5322c302
commit 70120ce077
4 changed files with 91 additions and 2 deletions
@@ -2785,6 +2785,13 @@ new Date()"));
Assert.AreEqual(12.34d, reader.ReadAsDouble());
}
[Test]
public void ReadAsDouble_Hex()
{
JsonTextReader reader = new JsonTextReader(new StringReader("0XCAFEBABE"));
Assert.AreEqual(3405691582d, reader.ReadAsDouble());
}
[Test]
public void ReadAsDouble_AllowThousands()
{
@@ -6969,6 +6969,70 @@ Path '', line 1, position 1.");
Assert.AreEqual(d1[0], d2[0]);
}
internal class HasByteArray
{
public byte[] EncryptedPassword { get; set; }
}
[Test]
public void DeserializeByteArrayWithTypeName()
{
string json = @"{
""$type"": ""Newtonsoft.Json.Tests.Serialization.JsonSerializerTest+HasByteArray, Newtonsoft.Json.Tests"",
""EncryptedPassword"": {
""$type"": ""System.Byte[], mscorlib"",
""$value"": ""cGFzc3dvcmQ=""
}
}";
HasByteArray value = JsonConvert.DeserializeObject<HasByteArray>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
});
CollectionAssert.AreEquivalent(Convert.FromBase64String("cGFzc3dvcmQ="), value.EncryptedPassword);
}
[Test]
public void DeserializeByteArrayWithTypeName_BadAdditionalContent()
{
string json = @"{
""$type"": ""Newtonsoft.Json.Tests.Serialization.JsonSerializerTest+HasByteArray, Newtonsoft.Json.Tests"",
""EncryptedPassword"": {
""$type"": ""System.Byte[], mscorlib"",
""$value"": ""cGFzc3dvcmQ="",
""$value"": ""cGFzc3dvcmQ=""
}
}";
ExceptionAssert.Throws<JsonReaderException>(() =>
{
JsonConvert.DeserializeObject<HasByteArray>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
});
}, "Error reading bytes. Unexpected token: PropertyName. Path 'EncryptedPassword.$value', line 6, position 13.");
}
[Test]
public void DeserializeByteArrayWithTypeName_ExtraProperty()
{
string json = @"{
""$type"": ""Newtonsoft.Json.Tests.Serialization.JsonSerializerTest+HasByteArray, Newtonsoft.Json.Tests"",
""EncryptedPassword"": {
""$type"": ""System.Byte[], mscorlib"",
""$value"": ""cGFzc3dvcmQ=""
},
""Pie"": null
}";
HasByteArray value = JsonConvert.DeserializeObject<HasByteArray>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects
});
Assert.IsNotNull(value.EncryptedPassword);
CollectionAssert.AreEquivalent(Convert.FromBase64String("cGFzc3dvcmQ="), value.EncryptedPassword);
}
[Test]
public void SerializeInheritanceHierarchyWithDuplicateProperty()
{
+7 -1
View File
@@ -523,7 +523,13 @@ namespace Newtonsoft.Json
ReadIntoWrappedTypeObject();
byte[] data = ReadAsBytes();
Read();
ReaderReadAndAssert();
if (TokenType != JsonToken.EndObject)
{
throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
}
SetToken(JsonToken.Bytes, data, false);
return data;
}
+13 -1
View File
@@ -449,6 +449,7 @@ namespace Newtonsoft.Json
public override byte[] ReadAsBytes()
{
EnsureBuffer();
bool isWrappedArray = false;
switch (_currentState)
{
@@ -475,11 +476,22 @@ namespace Newtonsoft.Json
case '"':
case '\'':
ParseString(currentChar, ReadType.ReadAsBytes);
return (byte[])Value;
byte[] data = (byte[])Value;
if (isWrappedArray)
{
ReaderReadAndAssert();
if (TokenType != JsonToken.EndObject)
{
throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType));
}
SetToken(JsonToken.Bytes, data, false);
}
return data;
case '{':
_charPos++;
SetToken(JsonToken.StartObject);
ReadIntoWrappedTypeObject();
isWrappedArray = true;
break;
case '[':
_charPos++;