在不使用Java

时间:2015-11-16 03:13:16

标签: javascript java json

我在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的方法?

5 个答案:

答案 0 :(得分:5)

如果您导入了 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();

答案 1 :(得分:1)

    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

答案 2 :(得分:1)

Jackson映射到Map<String, Object>也没关系:

    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对象的值是静态类型检查,我仍然建议这样做。

答案 3 :(得分: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);
        }

    }

答案 4 :(得分:-3)

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