gpt4 book ai didi

json - Delphi SuperObject 按与添加顺序不同的顺序对值进行排序

转载 作者:行者123 更新时间:2023-12-03 15:48:18 25 4
gpt4 key购买 nike

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

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

1 means ascending and -1 means descending. But that's not the important part. What's important is that these values in the sort object must be organized in this manner.

To produce this object, I'm doing this:

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 的原因。

最佳答案

documentation对于 JSON 来说,它的字典对象是无序的:

An object is an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).

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

An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).

如果您想保留键的顺序,则需要与字典分开执行此操作。任何通过名称/值对的写入顺序表达含义的程序都不符合 JSON 规范。因此,如果您的服务器依赖于顺序,那么该文件就不再是 JSON 文件。

顺序在这里显然很重要。所以解决方案很明确。使用有序数据类型,即数组。您的 JSON 应该是:

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

关于json - Delphi SuperObject 按与添加顺序不同的顺序对值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com