使用java中的Jackson库解析嵌套的JSON数组

时间:2015-06-25 13:25:48

标签: java json jackson

我想知道如何使用java中的jackson库解析以下JSON来构造像http://api.statdns.com/google.com/cname

这样的URI
{
    "status": {
        "status": 200,
        "msg": "SUCCESS"
     },
    "apicalls": [
        {
            "API": {
                "method": "get",
                "success": "200",
                "baseURL": "http://api.statdns.com/",
                "param1": "google.com/",
                "param2": "cname",
                "continue_on_fail": "1",
                "add_header2": "'Accept', 'application/json'",
                "add_header1": "'Content-Type', 'application/json'",
                "client_id": "101"
            },
            "id": 1385
        }
    ]
 }

我编写了错误的代码来解析上面的json数组。以下是我使用的代码,

public void parseJSON(String json) {
    try{
    JsonFactory factory = new JsonFactory();
    JsonParser parser;
    parser = factory.createJsonParser(json);
    parser.setCodec(new ObjectMapper()); // to avoid IllegalStateException  
    JsonToken current;
    current = parser.nextToken();
    if (current != JsonToken.START_OBJECT) {
       System.out.println("Error: root should be object: quiting.");
                return;
            }

            while (parser.nextToken() != JsonToken.END_OBJECT) {
                String fieldName = parser.getCurrentName();
                // Move from field name to field value
                current = parser.nextToken();
                if (fieldName.equals("APIcalls")) {
                    JsonNode node = parser.readValueAsTree();
                    JsonNode currentJson = node.findValue("API");
                    System.out.println("Current JSON :: " + currentJson);

                    JsonNode url = currentJson.get("baseURL");
                    JsonNode param1 = currentJson.get("param1");
                    JsonNode param2 = currentJson.get("param2");

                    String baseURL = url.asText();
                    String params1 = param1.asText();
                    String params2 = param2.asText();
                    String uri = baseURL + params1 + params2;
                    System.out.println("URL :: " + uri);

                    initiateRESTCall(uri);

                }
            }
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

有没有人可以帮助我知道使用jackson解析JSON?非常感谢帮助。

3 个答案:

答案 0 :(得分:1)

如果你使用的是jackson库,那么你应该这样:

我正在使用http://api.statdns.com/google.com/cname

的回复
public void parseJSON(String json) {
JSONObject parse = new JSONObject(data);

        if(parse.get("question") instanceof JSONObject){
            JSONObject questionJson = (JSONObject) parse.get("question"); 
            System.out.println("Name"+questionJson.getString("name"));
            System.out.println("Type"+questionJson.getString("type"));
            System.out.println("Class"+questionJson.getString("class"));

        }
        else if(parse.get("question") instanceof JSONArray){
            JSONArray questionJson = (JSONArray) parse.get("question"); 
            String[] nameAttrib=new String[questionJson.length()];
            String[] typeAttrib=new String[questionJson.length()];
            String[] classAttrib=new String[questionJson.length()];
            for(int i=0;i<questionJson.length();i++){
                JSONObject questionJsonData=(JSONObject)questionJson.get(i);
                nameAttrib[i]=questionJsonData.getString("name");
                typeAttrib[i]=questionJsonData.getString("type");
                classAttrib[i]=questionJsonData.getString("class");
                System.out.println("Name: "+nameAttrib[i]);
                System.out.println("Type: "+typeAttrib[i]);
                System.out.println("Class: "+classAttrib[i]);
            }

        }
        else if (parse.get("question").equals(null)){

            System.out.println("question"+null);
        }
}

我正在为#34;问题&#34;只有,同样你也可以做其他人说&#34;回答&#34;,&#34;权威&#34;如果你提到了网址http://api.statdns.com/google.com/cname

希望它可以帮助您解决问题.. !!!!

答案 1 :(得分:0)

我不了解JACKSON库,但我认为它与GSON类似。你只需要做一些POJO,图书馆将负责为你填写字段。

例如,要将您的字符串转换为MyJSONClass,请使用以下类:

class Status {
    int status;
    String msg;
}
class APIClass {
    String method;
    String success;
    String baseURL;
    String param1;
    String param2;
    String continue_on_fail;
    String add_header2;
    String add_header1;
    String client_id;
}
class APICall {
    APIClass API;
    int id;
}
class MyJSONClass {
    Status status;
    List<APICall> apicalls;
}

可以使用JACKSON库(thanks to this stackoverflow answer)将这组类转换为JSON,如下所示:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);

答案 2 :(得分:0)

如果您对JSON没有变化有信心,那么简化代码的快捷方法就是使用JSON Pointers

// prefer injecting your project's ObjectMapper
private static final ObjectMapper om = new ObjectMapper();

public void parseJSON(String json) throws IOException {
    JsonNode jsonNode = om.readTree(json);
    String uri = new StringBuilder(jsonNode.findValue("baseURL").asText())
            .append(jsonNode.findValue("param1").asText())
            .append(jsonNode.findValue("param2").asText())
            .toString();
    initiateRESTCall(uri);
}

如果返回多个apicalls条目,则会变得容易受到攻击。