-Fixed deserializing to a type when setting JToken extension data

This commit is contained in:
James Newton-King
2015-12-05 13:01:46 +13:00
parent eb0cbd6a75
commit 92102f9a33
4 changed files with 137 additions and 52 deletions
@@ -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]);
}
}
}