如何按值对JObject进行排序

7

I have some JSON:

{
    "AI": "1",
    "AJ": "0",
    "AM": "0",
    "AN": "0",
    "BK": "5",
    "BL": "8",
    "BM": "0",
    "BN": "0",
    "BO": "4",
    "CJ": "0",
    "CK": "2"
}

我希望能够按数字从高到低排序,并通过只写JSON的第一个索引来获取具有最高数字的属性。您能帮我吗?
这是我目前拥有的内容:
string voteJson = File.ReadAllText("vote.json");
Object voteObj = JObject.Parse(voteJson);

//How to sort the object here?

//Saving it 
string output = Newtonsoft.Json.JsonConvert.SerializeObject(voteObj, 
    Newtonsoft.Json.Formatting.Indented);
File.WriteAllText("vote-sorted.json", output);

1
那是一个对象。它没有索引,其值也不是有序的。JSON将对象定义为:“对象是一组无序的名称/值对。” - user47589
这不是一个“//在这里填写一些好的代码”的网站。请阅读[提问]并参观[导览]。 - Ňɏssa Pøngjǣrdenlarp
我已经搜寻了数小时,但就是找不到任何排序函数或类似的东西。我两天前开始编写C#代码,现在需要帮助。这是我唯一知道的代码网站,所以我来这里求问…… - TheGamingMaik
这不是一个教程网站。请阅读[提问指南]并参观[导览]。 - Ňɏssa Pøngjǣrdenlarp
正如@Amy所指出的,您不能直接对JSON对象进行排序。 唯一能做的就是将其转换为一对列表,然后进行排序。 或者更好的方法是,只需遍历JSON对象的一对并跟踪最高的一对,以避免多次循环。要遍历JSON对象,请参阅提供的解决方案 - Pic Mickael
1个回答

10

尽管JSON规范将JSON对象定义为一个无序的属性集,但Json.Net的JObject类似乎确实可以维护其中属性的顺序。您可以使用以下方式按值对属性进行排序:

JObject voteObj = JObject.Parse(voteJson);

var sortedObj = new JObject(
    voteObj.Properties().OrderByDescending(p => (int)p.Value)
);

string output = sortedObj.ToString();

然后,您可以像这样获取具有最高值的属性:

JProperty firstProp = sortedObj.Properties().First();
Console.WriteLine("Winner: " + firstProp.Name + " (" + firstProp.Value + " votes)");

演示链接:https://dotnetfiddle.net/dptrZQ


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接