【发布时间】:2016-08-10 03:56:27
【问题描述】:
根据Json.Net documentation,所有IEnumerable类型都应该序列化为json数组。
所以我期待以下课程:
public class MyClass
{
public IEnumerable<string> Values { 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 IEnumerable<string> Values { 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<string>(),
Values3 = new string[0],
Values4 = new List<string>(),
Values5 = new string[0]
};
var builder = new StringWriter();
target.Serialize(builder, myEvent);
var json = builder.ToString();
}
public class MyClass
{
public IEnumerable<string> Values1 { get; set; }
public IEnumerable<string> Values2 { get; set; }
public IList<string> Values3 { get; set; }
public IList<string> Values4 { get; set; }
public string[] Values5 { get; set; }
}
这是结果:
{
"Values1": {
"$type": "System.String[], mscorlib",
"$values": []
},
"Values2": [],
"Values3": {
"$type": "System.String[], mscorlib",
"$values": []
},
"Values4": [],
"Values5": []
}
我还是不明白为什么我会根据组合得到不同的结果。
【问题讨论】: