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

 lixinglon257 发布于 2023-02-13 12:33

我正在使用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 个回答
  • JSON 的文档声明其字典对象是无序的:

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

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

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

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

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

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

    2023-02-13 12:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有