根据Json.Net文档,所有的
因此,我期望以下类:
我正在使用Newtonsoft 7.0.1。 更新: 这里有另一个测试,使用了更多的类型:
IEnumerable
类型应该被序列化为json数组。因此,我期望以下类:
public class MyClass
{
public IEnumerable<string> Values { get; set; }
}
序列化为:
{
"Values": []
}
问题是当我使用 TypeNameHandling=Auto
时,会出现以下情况:
{
"Values": {
"$type": "System.String[], mscorlib",
"$values": []
}
}
我需要TypeNameHandling=Auto
应用到其他属性,但是我希望IEnumerable
使用默认序列化。其他类型(例如IList
)按照预期工作。
这是一个bug还是我漏掉了什么?
这里是重现问题所需的完整代码:
[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": []
}
我仍然不理解为什么在不同的组合情况下会得到不同的结果。
List
还是array
而有所不同。 - Davide Icardinew string[0]
设置为一个IList
字段,你会得到相同的行为。正如我所指出的,默认反序列化行为是为Enumerable
和IList
接口字段创建一个List
实例。如果您指定了一个明确的对象类型,它将使用该类型;但是有许多方法可以实例化IEnumerable
。如果你违背默认值,唯一知道你使用了什么实例的方法是添加$type
元数据。 - Meirion Hughes