【发布时间】:2018-11-16 08:44:49
【问题描述】:
我有一个如下的 JSON 字符串:
{
"MetaData": {
"ResourcesUsed": 1
},
"Result": [
{
"locations": [
{
"country": "Papua New Guinea",
"city": "Jacquinot Bay",
"locTypeAttributes": {
"localDate": "2018-10-08T04:21:00-07:00",
"utcDate": "2018-10-08T04:21:00-07:00",
},
"point": {
"coordinates": [
151.52,
-5.6
],
"type": "Point"
}
},{
"country": "Papua New Guinea2",
"city": "Jacquinot Bay2",
"locTypeAttributes": {
"localDate": "2018-10-08T04:21:00-07:00",
"utcDate": "2018-10-02T04:21:00-07:00",
},
"point": {
"coordinates": [
151.52,
-5.6
],
"type": "Point"
}
}
]
}
]
}
我使用 Newtonsoft 将其转换为 JSON 对象。我想要做的是通过嵌套在每个locations 项目中的utcDate 字段对Result 数组中的locations 数组进行排序。我找到了以下线程:C# Sort JSON string keys。但是,我仍然无法实现它,因为我的对象中有数组,而该问题纯粹涉及按属性名称按字母顺序对对象中的对象进行排序。
这是我目前写的一段代码:
public string GenerateJson()
{
var model = (JObject)JsonConvert.DeserializeObject(data);
Sort(model);
}
private void Sort(JObject jObj)
{
var props = jObj["Result"][0]["locations"].ToList();
foreach (var prop in props)
{
prop.Remove();
}
foreach (var prop in props.OrderBy(p => p.Name))
{
jObj.Add(prop);
if (prop.Value is JObject)
Sort((JObject)prop.Value);
if (prop.Value is JArray)
{
Int32 iCount = prop.Value.Count();
for (Int32 iIterator = 0; iIterator < iCount; iIterator++)
if (prop.Value[iIterator] is JObject)
Sort((JObject)prop.Value[iIterator]);
}
}
}
【问题讨论】:
-
为什么不反序列化为自定义类,然后对其进行排序(通常)
-
@Disaffected1070452 这是我最后的手段,我试图避免创建任何自定义类。
-
您要对
"Result": []数组进行排序,还是要对每个"Result[*].locations"数组进行排序?因为位置本身是一个数组,所以原则上可能不止一个,每个都有自己的utcDate。如果你确实想对"Results"数组进行排序,你想如何处理结果有多个位置和多个utcDate值的情况? C# Sort JSON string keys 用于按属性名称递归地对对象树进行排序,因此它实际上并不适用于此。 -
@dbc 我只是简化了 JSON 字符串,所以在结果中,我们将始终有一个位置数组,我想按
utcDate对该数组进行排序。