【发布时间】: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