我有一个从数据库中的两个字段读取的值字典:字符串字段和数字字段.字符串字段是唯一的,因此这是字典的键.
我可以对键进行排序,但是如何根据值进行排序?
注意:我已阅读Stack Overflow问题如何按Python中字典的值对字典列表进行排序?并且可能可以更改我的代码以获得字典列表,但由于我不需要字典列表,我想知道是否有更简单的解决方案.
好的,我可以使用OrderedDict了json.dump.也就是说,OrderedDict可以用作JSON的输入.
但它可以用作输出吗?如果是这样的话?在我的情况下,我想load进入OrderedDict,这样我就可以保持文件中键的顺序.
如果没有,是否有某种解决方法?
我们经常希望使用JSON来实现人类可读性.因此,通常要求在Go中,在.NET中,在Python中,在Java中按字母顺序(或字母数字)对JSON键进行排序,...
但是如何在Swift中按字母顺序输出带有JSON键的JSON?
PrettyPrinted输出很简单:
JSONSerialization.writeJSONObject(jsonObject, to: outputStream, options: [.prettyPrinted], error: nil)
Run Code Online (Sandbox Code Playgroud)
然而,按键不按字母顺序排列以供人类阅读.它们很可能是由NSDictionary.keyEnumerator()给出的顺序.但遗憾的是,我们不能在Swift中继承Dictionary,NSDictionary或CFDictionary,因此我们无法覆盖键顺序的行为.
[编辑:实际上,我们可以继承NSDictionary,请参阅下面的一个答案]
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
当我使用SuperObject序列化这个"排序"对象时出现问题.值似乎是重新排列的,所以例如上面的JSON实际上会出现这样的事情:
"sort": {
"first_sort_field": 1,
"fourth_sort_field": 1
"second_sort_field": 1,
"third_sort_field": -1,
}
这与我的意图不同.这会导致服务器返回以不同于预期的方式排序的响应数据.
问题是,如何使SuperObject按照我添加的顺序而不是自己的顺序序列化数据?我认为它可能是按ABC顺序排序值,但是当组合不同类型的值(字符串,整数,对象,数组等)时,它们不是ABC顺序.我想强制SuperObject按照我添加它的顺序序列化数据.
我能看到的唯一解决方案是通过连接字符串手动序列化此对象.但是我想尽可能避免这种情况 - 这就是我首先使用SuperObject的原因.