【问题标题】:JAVA: Save data in JSON [duplicate]JAVA:以 JSON 格式保存数据 [重复]
【发布时间】:2015-10-02 10:08:37
【问题描述】:

当您在JSONObject 中添加数据时,它将以自己的方式存储。 这是我要传达的示例。

JSONObject obj = new JSONObject();

obj.put("metricname", "splunk-ui");
obj.put("timestamp", 1234567890);
obj.put("value",34);


System.out.println(obj);

上面的代码 sn-p 将给出下面的输出。

{
    "metricname": "splunk-ui",
    "value": 34,
    "timestamp": 1234567890
}

这是问题所在:-

我按以下顺序添加数据:- metricnametimestampvalue

这是显示顺序:- metricnamevaluetimestamp

那么,我如何在JSONObject 中强制执行我的数据添加顺序??

仅供参考:- 这样做是强制性的,因为我会将这个 JSON 对象传递给另一个 API,该 API 可以扫描 metricnametimestampvalue 中的数据。

我在这里发布用于解决此问题的代码片段:-

我已使用 GSON 库和此链接来使此代码正常工作。 GSON Documention

JsonObject jsonObject = new JsonObject();

jsonObject.addProperty("metric", "mihirmonani");
jsonObject.addProperty("timestamp", 1346846400);
jsonObject.addProperty("value", 14);

JsonArray jArray = new JsonArray();

JsonObject jObject = new JsonObject();

jObject.addProperty("host", "splunk");
jObject.addProperty("host1", "splunk1");

jsonObject.add("tags",jObject);

System.out.println(jsonObject);

【问题讨论】:

  • JSON 对象的属性没有顺序。这并不特定于 Java 或任何实现。如果需要特定顺序,则必须使用 JSON 中的数组,而不是对象。确保您了解其中的区别。

标签: java json


【解决方案1】:

您不能使用 JSONObject 保持订单的唯一方法是使用 JSONArray

    [
      {"name" : "metricname", "value" : "splunk-ui"},
      {"name" : "value", "value" : 34},
      {"name" : "timestamp", "value" : 1234567890}
    ]

【讨论】:

    【解决方案2】:

    简短的回答:你不能。 JSONObject 在内部使用HashMap,它根据哈希码的顺序返回值。

    您可以使用JSONWriter 显式写入值。

    编辑:澄清一下,正如 Manu 指出的那样,在将值放入 JSONObject 后,您将无法检索订单。我的建议是不要把值放在JSONObject开头,而是用JSONWriter直接写值。

    【讨论】:

    • 原因不在于 JSONObject 是如何实现的。原因是 JSON 没有指定 JSON 对象的属性顺序。这就是 JSON 的工作原理。使用 JSONWriter 不会改变这一点。
    • 虽然 JSON 没有指定任何顺序是正确的,但这绝不意味着实现对发出值的顺序没有任何影响。 JSONObject 是一种实现,而不是规范,它按照从内部 HashMap 迭代的顺序发出值。 JSONWriter 直接写入值,因此顺序正是您编写它们的方式。 JSON 解析器在期望某个特定顺序时不正确仅意味着它是一个糟糕的 JSON 解析器,而不是您不能以它期望的方式发出值。
    • @PatrickSimpson 当然,您可以按某种顺序写入值,但不能按照它们插入的顺序,因为该顺序是未知的。
    • @Manu 好点。澄清一下,我不建议在将值放入 JSONObject 之后使用 JSONWriter,而是将它们放入其中。
    猜你喜欢
    • 2023-03-29
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2012-09-28
    • 2017-06-02
    • 2019-11-02
    相关资源
    最近更新 更多