【问题标题】:Delphi SuperObject sorting values in a different order than addedDelphi SuperObject 排序值的顺序与添加的顺序不同
【发布时间】:2013-12-03 01:05:44
【问题描述】:

我正在使用 SuperObject 来生成 JSON。我正在使用的服务器有一些排序数据结果的规范(这与排序数据有关的事实与我关于排序的实际问题无关)。问题是,服务器希望这些值按照排序的顺序列出,例如...

“种类”: { “first_sort_field”:1, “second_sort_field”:1, “第三个排序字段”:-1, “第四个排序字段”:1 }

1 表示升序,-1 表示降序。但这不是重要的部分。重要的是sort 对象中的这些值必须以这种方式组织。

为了生成这个对象,我这样做:

var
  O, O2: ISuperObject;
  X: Integer;
  //more
begin
  O:= SO; //main object

  //more

  O2:= SO; //sub object
  for X := 0 to FSort.Count - 1 do begin
    case FSort[X].Direction of
      sdAscending:  O2.I[FSort[X].FieldName]:= 1;
      sdDescending: O2.I[FSort[X].FieldName]:= -1;
    end;
  end;
  O.O['sort']:= O2;

  //more
end;

当我使用 SuperObject 序列化这个“排序”对象时,问题就出现了。这些值似乎是重新排列的,所以例如上面的 JSON 实际上会是这样的:

“种类”: { “first_sort_field”:1, “第四个排序字段”:1 “second_sort_field”:1, “第三个排序字段”:-1, }

这与我预期的顺序不同。这会导致服务器返回以与预期不同的方式排序的响应数据。

问题是,我怎样才能让 SuperObject 按照我添加的顺序而不是它自己的顺序来序列化数据?我认为它可能会按 ABC 顺序对值进行排序,但是当组合不同类型的值(字符串、整数、对象、数组等)时,它们不是按 ABC 顺序排列的。我想强制 SuperObject 按我添加的顺序序列化数据。

我能看到的唯一解决方案是通过连接字符串手动序列化这个对象。但如果可能的话,我想避免这种情况——这就是我首先使用 SuperObject 的原因。

【问题讨论】:

  • JSON 不按设计保留排序顺序。见here
  • 顺便说一下,SuperObject 是一个不错的库,但 lkJSON 没有这样的问题,即与预期的顺序相同。 :)

标签: json delphi sorting serialization superobject


【解决方案1】:

JSON 的 documentation 声明其字典对象是无序的:

对象是一组无序的名称/值对。对象以 {(左大括号)开始,以 }(右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。

相比之下,JSON 数组是有序的:

数组是值的有序集合。数组开始 带有 [(左括号)并以 ](右括号)结尾。价值观 用 ,(逗号)分隔。

如果您想保留键的顺序,则需要与字典分开进行。任何通过名称/值对的写入顺序来表达含义的程序都超出了 JSON 规范。因此,如果您的服务器依赖于订单,则该文件不再是 JSON 文件。

这里的顺序显然很重要。所以解决方案很明确。使用有序数据类型,数组。你的 JSON 应该是:

“种类”: [ { "name": "first_sort_field", "order": 1 }, {“名称”:“second_sort_field”,“订单”:1 }, ...... ]

【讨论】:

  • 谢谢,只是让服务器的作者更改规格的问题,幸运的是,该服务器仍处于早期开发阶段,尚未使用。另外,我不明白你为什么编辑我的问题,特别是 JSON - 你的编辑与我已经拥有的相同:-)
  • @JerryDodge 我改进了视觉效果。在您的原始版本中,JSON 是一个代码块,并且被格式化为 Pascal。这意味着 {} 之间的部分显示为 cmets。通过使用
     我避免了这种情况。您可以在原始版本中看到我的意思:stackoverflow.com/revisions/20340920/1
  • 服务器的开发者不这么认为,不想改变这一点。他正在使用 mongodb 并声称 mongodb 实际上具有此规范,并且不同意您的说法。我不是说你错了,我只是想知道为什么 mongodb 会违抗 JSON 的规则?
  • 我实际上并没有声称任何东西。我刚刚引用了 json.org 的内容,所以提出索赔的是他们,我们与 json.org 争论的是谁?!我对mongodb一无所知。但是如果语义是对象是有序的,那么你所拥有的就是表面上看起来像 JSON 但实际上不是 JSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多