我正在使用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的原因。
答案 0 :(得分:5)
JSON的documentation表明其字典对象是无序的:
对象是一组无序的名称/值对。对象以{(左括号)开头,以}结尾(右大括号)。每个名称后跟:(冒号),名称/值对用(逗号)分隔。
作为对比,JSON数组是有序的:
数组是有序的值集合。一个数组开始 用[(左括号)和以...结尾(右括号)。值 由(逗号)分隔。
如果您想要保留按键的顺序,则需要与字典分开进行。任何通过写入名称/值对的顺序表达含义的程序都不属于JSON规范。因此,如果您的服务器依赖于订单,则会使该文件不再是JSON文件。
订单在这里显然很重要。因此解决方案很明确。使用有序数据类型,数组。你的JSON应该是:
"sort": [ { "name": "first_sort_field", "order": 1 }, { "name": "second_sort_field", "order": 1 }, ..... ]