根据Json.Net文档,所有IEnumerable
类型都应该序列化为json数组.
所以我期待以下课程:
public class MyClass { public IEnumerableValues { get; set; } }
被序列化为:
{ "Values": [] }
问题是,当我使用时,TypeNameHandling=Auto
我得到:
{ "Values": { "$type": "System.String[], mscorlib", "$values": [] } }
我需要TypeNameHandling=Auto
其他属性,但我希望IEnumerable
使用默认序列化.其他类型(IList
例如)按预期工作.
这是一个错误或我错过了什么?
这里是重现问题的完整代码:
[Test] public void Newtonsoft_serialize_list_and_enumerable() { var target = new Newtonsoft.Json.JsonSerializer { TypeNameHandling = TypeNameHandling.Auto }; var myEvent = new MyClass { Values = new string[0] }; var builder = new StringWriter(); target.Serialize(builder, myEvent); var json = JObject.Parse(builder.ToString()); Assert.AreEqual(JTokenType.Array, json["Values"].Type); } public class MyClass { public IEnumerableValues { get; set; } }
我正在使用Newtonsoft 7.0.1.
更新:这里使用更多类型的另一个测试:
[Test] public void Newtonsoft_serialize_list_and_enumerable() { var target = new Newtonsoft.Json.JsonSerializer { TypeNameHandling = TypeNameHandling.Auto }; var myEvent = new MyClass { Values1 = new string[0], Values2 = new List(), Values3 = new string[0], Values4 = new List (), Values5 = new string[0] }; var builder = new StringWriter(); target.Serialize(builder, myEvent); var json = builder.ToString(); } public class MyClass { public IEnumerable Values1 { get; set; } public IEnumerable Values2 { get; set; } public IList Values3 { get; set; } public IList Values4 { get; set; } public string[] Values5 { get; set; } }
这是结果:
{ "Values1": { "$type": "System.String[], mscorlib", "$values": [] }, "Values2": [], "Values3": { "$type": "System.String[], mscorlib", "$values": [] }, "Values4": [], "Values5": [] }
我再次理解为什么根据组合得到不同的结果.