【问题标题】:Parse different JSON responses without using POJO classes in Java在 Java 中不使用 POJO 类解析不同的 JSON 响应
【发布时间】:2016-02-17 02:42:58
【问题描述】:

我正在用 Java 解析来自 REST API 的 JSON 响应,但我不想为每个响应创建一个 Java 类 (POJO)(响应具有不同的数据结构和字段)。 Java 中是否有更通用的 JSON 解析器,类似于 JavaScript 的简单语法?

下面的 JSON 只是众多 REST 端点之一的结果

{
    "f1" : "volume",
    "f2" : "gender",
    "f3" : "days",
    "f4" : [{
            "id" : "F",
            "name" : "female",
            "values" : [{
                    "name" : "September",
                    "value" : 12
                }
            ]
        }, {
            "id" : "M",
            "name" : "male",
            "values" : [{
                    "name" : "September",
                    "value" : 11
                }
            ]
        }
    ]
}

在 JavaScript 中,访问女性的值:

jsonRoot.f4[0].values[0].value

这比创建大量 Java 类要简洁。您能否提出类似的建议或避免创建许多 POJO 的方法?

【问题讨论】:

  • 是的,使用 Jackson 这样的库。
  • @duffymo 根据上面的例子,你能举一个在杰克逊如何做到这一点的例子吗?我在网上看到的例子仍然使用Java类。
  • 如果您使用 ScriptEngine,那么您可以在 Java 中使用 JavaScript(如果您愿意的话)。
  • 当然,将其解析为 JSONObject。或者试试 JDK8 本身内置的 Nashorn JavaScript 引擎。你的一些努力将是值得注意的。
  • @duffymo 无法使用JDK8,我们的环境暂时限制在7。不过,如果可以将 Nashorn 插入到 7 中,它将调查它。

标签: javascript java json


【解决方案1】:

您可以使用org.json 库。

如果你使用 maven:

    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20150729</version>
    </dependency>

或者下载jar:http://mvnrepository.com/artifact/org.json/json

Java 示例:

import org.json.JSONObject;

public class JSONTest {

    public static void main(String[] args) {

        JSONObject jsonObject = new JSONObject("{'f1' : 'volume', 'f2' : 'gender', 'f3' : 'days'}"); // Truncated for example purpose

        String f1 = jsonObject.getString("f1");
        System.out.println(f1);
    }
}

你也可以访问数组

JSONArray f4Array = jsonObject.getJSONArray("f4");

然后对其进行迭代。

for (int i = 0; i < f4Array.length(); i++){
        String id = f4Array.getJSONObject(i).getString("id");
        String name = f4Array.getJSONObject(i).getString("name");
        System.out.println(name);
        System.out.println(id);
        JSONArray values = f4Array.getJSONObject(i).getJSONArray("values");
        for (int j = 0; j < values.length(); j++){
            String dName = values.getJSONObject(j).getString("name");
            int dValue = values.getJSONObject(j).getInt("value");
            System.out.println(dName);
            System.out.println(dValue);
        }

    }

【讨论】:

    【解决方案2】:

    如果你导入了com.google.gson的jar。你可以得到这样的值:

         String str="{" +
                "    \"f1\" : \"volume\"," +
                "    \"f2\" : \"gender\"," +
                "    \"f3\" : \"days\"," +
                "    \"f4\" : [{" +
                "            \"id\" : \"F\"," +
                "            \"name\" : \"female\"," +
                "            \"values\" : [{" +
                "                    \"name\" : \"September\"," +
                "                    \"value\" : 12" +
                "                }" +
                "            ]" +
                "        }, {" +
                "            \"id\" : \"M\"," +
                "            \"name\" : \"male\"," +
                "            \"values\" : [{" +
                "                    \"name\" : \"September\"," +
                "                    \"value\" : 11" +
                "                }" +
                "            ]" +
                "        }" +
                "    ]" +
                "}";
        JsonParser parser=new JsonParser();
        JsonObject object=(JsonObject)parser.parse(str);
        String value=object.get("f4").getAsJsonArray().get(0).getAsJsonObject()
                .get("values").getAsJsonArray().get(0).getAsJsonObject()
                .get("value").getAsString();
    

    【讨论】:

      【解决方案3】:

      Jackson 映射到Map&lt;String, Object&gt; 也可以:

          String data = "{\"f4\":[1, 2]}"
      
          try {
              Map<String, Object> value = mapper.readValue(data, Map.class);
              System.out.println(value.get("f4"));
          } catch (IOException e) {
              e.printStackTrace();
          } 
      

      为此定义POJO对象的价值在于静态类型检查,我仍然推荐这样做。

      【讨论】:

        【解决方案4】:
            String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
            Object obj=JSONValue.parse(s);
            JSONArray array=(JSONArray)obj;
            System.out.println(array.get(1));       
            System.out.println(((JSONObject)array.get(1)).get("1"));
        

        more example

        json-simple.jar

        【讨论】:

          【解决方案5】:

          如果你使用 jQuery,Jquery 中有一个 parseJson() 函数。

          【讨论】:

          • 我使用的是 Java,而不是 JavaScript
          • 糟糕,我的错误。我一直在使用 javascript,但忘了还有一个 java。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-13
          相关资源
          最近更新 更多