3

我正在使用 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 的原因。

4

1 回答 1

6

JSON的文档指出其字典对象是无序的:

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

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

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

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

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

“种类”: [
    { "name": "first_sort_field", "order": 1 },
    {“名称”:“second_sort_field”,“订单”:1 },
    ......
]
于 2013-12-03T07:15:39.443 回答