繁体   English   中英

使用json.net反序列化时是否保留了数组顺序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM