【问题标题】:Is it possible to change order of attributes when toJson()?toJson() 时是否可以更改属性的顺序?
【发布时间】:2016-08-10 07:28:18
【问题描述】:

让我们举这个例子。我有一个 pojo 类如下。

public class MyRecord{
    private String name;
    private String id;

    //constructors and getters,setters
}

当我得到上面的 toJson(new MyRecord("MyName","myId") 输出时,我可以得到。

{
  "name": "MyName",
  "id": "123" 
}

我继承了一个如下添加日期时间。

public class MyRecordWithDateTime extends MyRecord{
        private String DateTime;           

        //constructors and getters,setters
}

所以当我打电话给 toJson(new MyRecordWithDateTime("2016-01-01", "MyName", "myId"))

输出是这样的

{
  "name": "MyName",
  "id": "123",
  "dateTime": "2016-01-01" 
}

但我实际上需要如下。 (dateTime 应该排在第一位。)

{          
  "dateTime": "2016-01-01", 
  "name": "MyName",
  "id": "123"
}

有没有办法通过保持继承来做到这一点?

【问题讨论】:

  • 对象字段/成员没有顺序(也不应该)。如果您需要订购的成员,您应该使用列表/数组结构
  • @RichardH 如果您仔细观察过,Json.toJson() 按 getter 提取字段并完全遵循 getter 的顺序。即,如果您跳过某个字段的吸气剂,它将不会出现。我问这个的原因是,我想知道至少有没有注释。
  • 依赖于类中 getter 的编写顺序是糟糕的设计。你最好按照你想要的顺序自己调用吸气剂
  • 但这就是 JSON.toJson() 的工作原理。这是库实现,我对此无能为力。更改顺序的问题是“我怎样才能为继承的类做到这一点?”就像我的例子一样。它首先提取父类 getter。
  • 但这就是我的观点:类字段没有顺序。如果您希望对字段或值进行排序,则需要使用具有顺序的数据结构,即某种数组、列表或有序散列。

标签: java json pojo to-json


【解决方案1】:

JSON 集合中的字段/成员/属性没有顺序,就这个 JSON 数据结构而言,“顺序”无关紧要。

我可以想象您关心订单的唯一原因是出于打印/演示目的。在这种情况下,我建议您自己手动构建 JSON 字符串。

【讨论】:

  • 所以你的回答是否隐含暗示 ->“当你创建 JSON 响应时,根本不用担心键的顺序”???
  • 正确。 JSON 只是 javascript 对象的字符串表示形式。 javascript 对象中键的顺序绝对无关紧要 - 实际上没有定义顺序。如果您想以特定顺序打印带有键的 JSON 字符串,您必须自己实现此功能,而不是依赖库方法。
【解决方案2】:

在将其放入 JSON 文件之前,您可以尝试创建一个有序列表(LinkedList、ArrayList 或类似的东西),然后根据需要对其进行排序,然后将其放入 JSON 中。

但显然,存在比我更好的想法!

但事实是:JSON 不需要排序!您只需使用 getter,它就会找到与键关联的值!即使它在最后一个位置。

【讨论】:

  • 我找不到你。我想改变字段的顺序??
  • 只需在你的构造函数中使用一个列表。比如:private LinkedList<Object> values = new LinkedList<Object>(); Object 就是一个例子。这是一个字符串
  • 我可以按照您的建议使用列表,但这会改变缩进方面的响应格式吗?
  • 想象一下你的 LinkedHashMap(名称:linkHM)已正确排序和完成:JSONObject jo = new JSONObject(); for (Map.Entry<String, String> elem : linkHM.entrySet()) { jo.put(elem.getKey(),elem.getValue()); }
  • 但要做到这一点,我应该完全脱离对象本性对吧?这有些矛盾。
【解决方案3】:

也许有点晚了,但以防万一有这个注释@JsonPropertyOrder

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多