当我使用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>
,因为此集合不保留项目的顺序.
的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文档,可以安全地假定顺序已保留。
归档时间: |
|
查看次数: |
4301 次 |
最近记录: |