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

Chr*_*ris 13 c# json 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" }
    ]
}
Run Code Online (Sandbox Code Playgroud)

ToysThrownOnFloor是否保留Giraffe,Ball和Dad手机的订单,还是可以重新订购?

Ath*_*ari 14

这取决于你正在使用什么样的集合.

任何实现IEnumerable/的类IEnumerable<T>都可以序列化为JSON数组.Json.NET顺序处理集合,也就是说,它将按照集合返回的顺序序列化数组项,并按照GetEnumerator从JSON文件反序列化的顺序将项添加到集合中(Add在可变集合的情况下使用任一方法,和构造函数在不可变集合的情况下使用集合参数).

这意味着,如果集合保留项目(顺序T[],List<T>,Collection<T>,ReadOnlyCollection<T>等),订单将被序列化和反序列化时保留.但是,如果集合未保留项目的顺序(HashSet<T>等),则订单将丢失.

相同的逻辑适用于JSON对象.例如,序列化时订单将丢失Dictionary<TKey, TValue>,因为此集合不保留项目的顺序.


Met*_*urf 7

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
Run Code Online (Sandbox Code Playgroud)

根据规范和json.net文档,可以安全地假定顺序已保留。

  • 从规范中可以引用:**值的顺序很重要。**这不完全意味着应该保留顺序吗? (3认同)