【问题标题】:Building ordered JSON string (GSON library)构建有序 JSON 字符串(GSON 库)
【发布时间】:2021-12-25 20:46:32
【问题描述】:

下面是我的 JSON 应该是什么样子的一个简单示例。该对象具有名字和姓氏的字符串值、年龄的数字值和电话号码对象的数组值。

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567" 
        }
    ] 
}

这是我的代码:

        // creating JSONObject
        JSONObject jsonObj = new JSONObject();

        // putting data to JSONObject
        jsonObj.put("firstName", "John");
        jsonObj.put("lastName", "Smith");
        jsonObj.put("age", 25);

        // for phone numbers, first create JSONArray
        JSONArray jsonArr = new JSONArray();

        //  create LinkedHashMap
        Map<String,String> map = new LinkedHashMap<String, String>();

        map.put("type", "home");
        map.put("number", "212 555-1234");

        // adding map to list
        jsonArr.put(map);

        map.put("type", "fax");
        map.put("number", "212 555-1234");

        // adding map to list
        jsonArr.put(map);

        // putting phoneNumbers to JSONObject
        jsonObj.put("phoneNumbers", jsonArr);

        // Instantiate a new Gson instance.
        Gson gson = new Gson();

        // writing JSON to file:"JSONExample.json" in cwd
        String json = gson.toJson(jsonObj);

这就是我得到的:

{
"map":
{
"firstName":"John",
"lastName":"Smith",
"age":25,
"phoneNumbers":
{
"myArrayList":
[
{
"map":
       {
        "type":"home",
        "number":"212 555-1234"
       }
},
{
"map":
       {  
       "type":"fax",
       "number":"212 555-1234"
       }
}
]
}
}
}

如何去除 JSON 字符串中的“myArrayList”和“map”?

更新 我更改了代码的最后一部分:

// writing JSON to file:"JSONExample.json" in cwd
        String json = jsonObj.toString();

而且它有效。但是当我像这样将“firstName”修改为“first”时:

// putting data to JSONObject
        jsonObj.put("first", "John");
        jsonObj.put("last", "Smith");
        jsonObj.put("age", 25);

我的字符串很乱,这很奇怪。

{"last":"Smith","first":"John","age":25,"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"fax","number":"212 555-1234"}]}

我认为 GSON 库保持字符串有序。

【问题讨论】:

  • 你为什么不直接String json = jsonObj.toString()
  • 效果很好。
  • 好的,当我对代码进行少量更改时,这很奇怪。例如,如果我将“firstName”:“John”更改为“first”:“John”,我将得到无序字符串。你知道它有什么问题吗?
  • JSONObject 是名称/值对的无序集合。
  • 只要你混合库得到意想不到的结果,你试图做的事情就没有多大意义。 Gson 中没有像 JSONObject 这样的东西:Gson 类使用不同的命名,如 JsonObject。接下来,org.json.JSONObject 似乎遵循 JSON 规范,该规范通过使用 HashMap(至少对于我正在查看的实现)定义无序的 JSON 对象(如上所述)。另一方面,Gson 使用插入定义的顺序和链接哈希映射的自定义实现来保留插入顺序。

标签: java json gson


【解决方案1】:

尝试使用elegant-json。这个库默认保存元素的顺序。 这个 JSON:

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "phoneNumbers": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567" 
        }
    ] 
}

可以通过以下代码进行:

   new JsonObject()
       .add("firstName", new JsonString("John"))
       .add("lastName", new JsonString("Smith"))
       .add("age", new JsonInt(25))
       .add(
          "phoneNumbers", 
           new JsonArray()
               .add(
                   new JsonObject()
                       .add("type", new JsonString("home"))
                       .add("number", new JsonString("212 555-1234"))
               )
               .add(
                   new JsonObject()
                       .add("type", new JsonString("home"))
                       .add("number", new JsonString("212 555-1234"))
               )
       ).toJson();

注意:根据定义,JSON 没有排序。所以尽量不要依赖元素的顺序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-12
    • 2023-03-16
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多