-Fixed deserializing to a type when setting JToken extension data
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json.Tests.TestObjects;
|
||||
@@ -564,10 +565,7 @@ namespace Newtonsoft.Json.Tests.Serialization
|
||||
|
||||
JObject bizzaroC2 = (JObject)c2.ExtensionData["Self"];
|
||||
|
||||
Assert.AreEqual("Name!", (string)bizzaroC2["Name"]);
|
||||
Assert.AreEqual(1, (int)bizzaroC2["Test"]);
|
||||
|
||||
Assert.AreEqual(1, (int)c2.ExtensionData["Test"]);
|
||||
Assert.AreEqual("1", (string)bizzaroC2["$ref"]);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -833,5 +831,67 @@ namespace Newtonsoft.Json.Tests.Serialization
|
||||
() => { JsonConvert.SerializeObject(new DocNoGetter()); },
|
||||
"Invalid extension data attribute on 'Newtonsoft.Json.Tests.Serialization.ExtensionDataTests+DocNoGetter'. Member 'Content' must have a getter.");
|
||||
}
|
||||
|
||||
public class Item
|
||||
{
|
||||
[JsonExtensionData]
|
||||
public IDictionary<string, JToken> ExtensionData;
|
||||
|
||||
public IEnumerable<string> Foo
|
||||
{
|
||||
get { yield return "foo"; yield return "bar"; }
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Deserialize_WriteJsonDirectlyToJToken()
|
||||
{
|
||||
JsonSerializer jsonSerializer = new JsonSerializer
|
||||
{
|
||||
TypeNameHandling = TypeNameHandling.Auto
|
||||
};
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
jsonSerializer.Serialize(stringWriter, new Item());
|
||||
string str = stringWriter.GetStringBuilder().ToString();
|
||||
Item deserialize = jsonSerializer.Deserialize<Item>(new JsonTextReader(new StringReader(str)));
|
||||
|
||||
JToken value = deserialize.ExtensionData["Foo"]["$type"];
|
||||
Assert.AreEqual(JTokenType.String, value.Type);
|
||||
Assert.AreEqual("foo", (string)deserialize.ExtensionData["Foo"]["$values"][0]);
|
||||
Assert.AreEqual("bar", (string)deserialize.ExtensionData["Foo"]["$values"][1]);
|
||||
}
|
||||
|
||||
public class ItemWithConstructor
|
||||
{
|
||||
[JsonExtensionData]
|
||||
public IDictionary<string, JToken> ExtensionData;
|
||||
|
||||
public ItemWithConstructor(string temp)
|
||||
{
|
||||
}
|
||||
|
||||
public IEnumerable<string> Foo
|
||||
{
|
||||
get { yield return "foo"; yield return "bar"; }
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DeserializeWithConstructor_WriteJsonDirectlyToJToken()
|
||||
{
|
||||
JsonSerializer jsonSerializer = new JsonSerializer
|
||||
{
|
||||
TypeNameHandling = TypeNameHandling.Auto
|
||||
};
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
jsonSerializer.Serialize(stringWriter, new ItemWithConstructor(null));
|
||||
string str = stringWriter.GetStringBuilder().ToString();
|
||||
Item deserialize = jsonSerializer.Deserialize<Item>(new JsonTextReader(new StringReader(str)));
|
||||
|
||||
JToken value = deserialize.ExtensionData["Foo"]["$type"];
|
||||
Assert.AreEqual(JTokenType.String, value.Type);
|
||||
Assert.AreEqual("foo", (string)deserialize.ExtensionData["Foo"]["$values"][0]);
|
||||
Assert.AreEqual("bar", (string)deserialize.ExtensionData["Foo"]["$values"][1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user