代码之家  ›  专栏  ›  技术社区  ›  Michel

我可以依赖通过JsonSerializer读取的节点顺序吗?

  •  0
  • Michel  · 技术社区  · 7 年前

    我在这里读过 Is the order of elements in a JSON list preserved?

    那个 顺序很重要

    我也读过这里 Does List<T> guarantee insertion order? 那个 C#泛型列表中的插入顺序是有保证的

    因此,当我使用newtonsoftjsonserializer读取这个Json时

     "answers": [
                {
                    "choice": "36"
                },
                {
                    "choice": "50"
                }
            ]
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   dbc    7 年前

    是的,您可以依赖通过 JsonSerializer . A JSON 有序的值集合。 ,和Json.NET将按在JSON文件中遇到的顺序将它们添加到集合中。

    这可以通过检查 source code . 方法 JsonSerializerInternalReader.CreateList() 是负责集合反序列化的顶级方法,有三种基本情况:

    1. ICollection.Add() (或 ICollection<T>.Add() JsonSerializerInternalReader.PopulateList() .

      Add(object value) 方法,a CollectionWrapper<T> 将被创建来处理对所需参数类型的强制转换,但是这根本不会影响算法,因为包装器会立即调用 Add(T Value)

    2. 反序列化到.Net数组时,临时 List<T> 是为一些适当的 T 和值的添加顺序与案例1相同,通过 杰森塞里alizerInternalReader.PopulateList文件() JsonSerializerInternalReader.PopulateMultidimensionalArray() . 随后,通过调用 Array.CreateInstance 然后 List<T>.ICollection.CopyTo(Array, Int32) ,或 CollectionUtils.ToMultidimensionalArray() . 两者都创建保留传入集合值顺序的数组。

    3. 反序列化不可变集合时,该集合必须有一个采用 IEnumerable<T> 哪里 T型 release notes for Json.NET 6.0.3 :

      对于不可变.NET集合的所有未来创建者:如果您的T集合有一个 IEnumerable<T>

      列表<T> 然后从列表中构造一个不可变的集合,其中的值按照它们遇到和反序列化的顺序排列。

    当然,收藏 它本身 可能会改变值的顺序:

    但是对于基本的收藏 列表<T> T [] 这不会发生。