[英]Is array order preserved when deserializing using json.net?
当我使用json.net库将json对象反序列化为ac#object时,是否会保持数组属性中元素的顺序? 例如:
public class MySonsThreeFootRadius
{
public Boolean IsMessy { get; set; }
public Toy[] ToysThrownOnFloor { get; set; }
}
public class Toy
{
public String Name { get; set; }
}
{
"IsMessy": true,
"ToysThrownOnFloor": [
{ "Name": "Giraffe" },
{ "Name": "Ball" },
{ "Name": "Dad's phone" }
]
}
ToysThrownOnFloor是否保留Giraffe,Ball和Dad手机的订单,还是可以重新订购?
这取决于你正在使用什么样的集合。
任何实现IEnumerable
/ IEnumerable<T>
都可以序列化为JSON数组。 Json.NET顺序处理集合,也就是说,它将按照集合从GetEnumerator
返回它们的顺序序列化数组项,并按照从JSON文件反序列化的顺序将项添加到集合中(在可变的情况下使用Add
方法)集合,以及在不可变集合的情况下带有集合参数的构造函数)。
这意味着如果集合保留了项目的顺序( T[]
, List<T>
, Collection<T>
, ReadOnlyCollection<T>
等),则序列化和反序列化时将保留顺序。 但是,如果集合不保留项目的顺序( HashSet<T>
等),则订单将丢失。
相同的逻辑适用于JSON对象。 例如,序列化Dictionary<TKey, TValue>
时,订单将丢失,因为此集合不保留项目的顺序。
json规范没有明确规定应该保留订单,而是说:
数组结构是一对围绕零个或多个值的方括号令牌。 值以逗号分隔。 值的顺序很重要。
该规范还指出:
JSON还为有序的值列表提供支持。 所有编程语言都有一些用于表示此类列表的功能,这些功能可以按照数组,向量或列表等名称进行。
从json.net文档中 ,反序列化示例肯定会暗示要保留的顺序:
string json = @"[
{
'Name': 'Product 1',
'ExpiryDate': '2000-12-29T00:00Z',
'Price': 99.95,
'Sizes': null
},
{
'Name': 'Product 2',
'ExpiryDate': '2009-07-31T00:00Z',
'Price': 12.50,
'Sizes': null
}
]";
List<Product> products = JsonConvert.DeserializeObject<List<Product>>(json);
Console.WriteLine(products.Count);
// 2
Product p1 = products[0];
Console.WriteLine(p1.Name);
// Product 1
根据规范和json.net文档,可以安全地假设订单被保留。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.