【发布时间】:2015-07-13 20:47:53
【问题描述】:
我需要创建常量 json 字符串或按键排序的 json。常量 json 字符串是什么意思?请查看我创建的以下代码示例。
我的代码 1:
public class GsonTest
{
class DataObject {
private int data1 = 100;
private String data2 = "hello";
}
public static void main(String[] args)
{
GsonTest obj=new GsonTest();
DataObject obj2 = obj.new DataObject();
Gson gson = new Gson();
String json = gson.toJson(obj2);
System.out.println(json);
}
}
输出 1:
{"data1":100,"data2":"hello"}
我的代码 2:
public class GsonTest
{
class DataObject {
private String data2 = "hello";
private int data1 = 100;
}
public static void main(String[] args)
{
GsonTest obj=new GsonTest();
DataObject obj2 = obj.new DataObject();
Gson gson = new Gson();
String json = gson.toJson(obj2);
System.out.println(json);
}
}
输出 2:
{"data2":"hello","data1":100}
如果您看到,如果我切换变量(DataObject 类中的data1 和data2),我会得到不同的 json。我的目标是获得相同的 json,即使有人更改了类变量的位置。当有人添加新变量时,我明白了,json 会改变。但是当变量移动时 json 不应该改变。所以,我的目标是获得标准的 json,可能按同一类的排序键顺序。如果有嵌套的json,那么应该在嵌套结构中排序。
两个代码运行时的预期输出:
{"data1":100,"data2":"hello"} //sorted on keys!! Here keys are data1 & data2
我明白了,我需要更改String json = gson.toJson(obj2); 行中的一些内容,但我该怎么办?
为什么我需要订购它们?
我需要对 json 字符串进行编码,然后将其传递给另一个函数。如果我更改键的顺序,即使值保持不变,编码的值也会改变。我想避免这种情况。
【问题讨论】:
-
fwiw,在 json 中,键是无序的。因此,构建依赖于任何特定顺序的其他东西是一个值得商榷的想法……除非你只是为了美观而想要这样做。
-
@FatalError 我希望它们按顺序排列,因为我将对 json 字符串进行编码。如果键移动,我的编码会改变,我不想这样做。也进行了有问题的编辑。所以,我需要对它进行排序。
-
@Miroshko 链接不能完全解决我的问题。这里的问题是类结构可以改变。
-
@Abhishek:Imo 你最好反序列化 json,然后以某种规范化的方式对生成的对象进行哈希处理,这样你就可以控制你正在哈希的内容。同一个对象可以以多种等效方式序列化为 JSON 对象——即使字段顺序相同,它也可能有额外的空格(例如漂亮的打印)等。