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