Delphi SuperObject以不同于添加的顺序对值进行排序

时间:2013-12-03 01:05:44

标签: json delphi sorting serialization superobject

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

"sort": {
  "first_sort_field": 1,
  "second_sort_field": 1,
  "third_sort_field": -1,
  "fourth_sort_field": 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实际上会出现这样的结果:

"sort": {
  "first_sort_field": 1,
  "fourth_sort_field": 1
  "second_sort_field": 1,
  "third_sort_field": -1,
}

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

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

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

1 个答案:

答案 0 :(得分:5)

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

  

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

作为对比,JSON数组是有序的:

  

数组是有序的值集合。一个数组开始   用[(左括号)和以...结尾(右括号)。值   由(逗号)分隔。

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

订单在这里显然很重要。因此解决方案很明确。使用有序数据类型,数组。你的JSON应该是:

"sort": [
    { "name": "first_sort_field", "order": 1 },
    { "name": "second_sort_field", "order": 1 },
    .....
]