【问题标题】:Why Newtonsoft Serializer sorting dictionary items and how to avoid that?为什么 Newtonsoft Serializer 对字典项目进行排序以及如何避免这种情况?
【发布时间】:2015-07-11 12:31:56
【问题描述】:

当我有带有随机字符串键的字典 (IDictionary) 项目(在 C# 中)时,我得到的 JSON 对象为:

{
"Y21qf39sXRU=":"A",
"/N+BQBzpdkA=":"A+",
"HQ5dFtxIsGo=":"B",
"2i4tdo427Sw=":"ACCOUNTANT",
"W6EuZP1+iKY=":"Accountant",
"eaSybclf0ww=":"Client", .... //and so on

但是当我将键更改为数字键时,字典中的项目按键排序为:

{
"1":"Closed Accounts",
"260":"A",
"283":"Client",
"334":"Accountant",
"437":"new CATEGORY",
"757":"Prospect",
"973":"A+",
"1099":"B", ....

为什么 Newtonsoft.JSON 序列化程序会这样做以及如何避免对数字键进行排序?

我想要在第一个 JSON 中排序的结果(从数据库中排序)。我知道我可以再次对结果进行排序,但现在我想避免这样做。

【问题讨论】:

  • 字典本身没有排序顺序。从字典的公共合同的角度来看,“排序顺序”(因为在序列化时必须先出现)都和另一个一样好。如果你关心键的顺序,字典不是最好的结构。
  • 你为什么关心你的 json 键是如何排序的?消费者永远不应该关心 json 键的顺序。 (stackoverflow.com/questions/4515676/…)
  • 这里的问题不是 Json.NET,这里的问题是,对于 c# 通用字典。 The order in which the items are returned is undefined. 即这些项目以内部哈希顺序返回,如果重新哈希表,顺序可能会改变。 AFAIK 没有内置的 c# 集合同时具有散列键访问和索引访问,但是由于您的键和值是字符串,您可以包装 NameValueCollection

标签: c# json asp.net-web-api


【解决方案1】:

根据定义,字典是无序的。它最终如何被排序通常是一些散列函数的结果。事实上,甚至不能确定使用相同的数据集连续两次生成相同的订单。出于礼貌,一些实现会保持秩序,或者如果你用一些标志强制它,但这些都是黑客行为。如果您需要订购某些东西,则需要使用不同的数据结构。不幸的是,JSON 的唯一其他结构是数组,所以使用数组。如果必须有对,请使用一个字典数组,其中每个字典只有一个键值对。

【讨论】:

  • 只有一个注释,“根据定义,一个Dictionary<,>”,因为SortedDictionary<,> 是一个IDictionary<,>,将自己命名为一个“字典”,但已排序。
  • 我真的很糟糕......我应该知道这一点。当您错过基础知识时,就会发生这种情况。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2020-09-07
  • 2020-07-21
相关资源
最近更新 更多