【问题标题】:Parsing the nested JSON Array using Jackson library in java在java中使用Jackson库解析嵌套的JSON数组
【发布时间】:2015-09-12 03:20:17
【问题描述】:

我想知道如何在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();
        }
    }

谁能帮我知道如何使用杰克逊解析 JSON?非常感谢您的帮助。

【问题讨论】:

标签: java json jackson


【解决方案1】:

我不知道 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);

【讨论】:

  • @Trapll 我只想使用 jackson 库
  • @Trapll 为什么我应该使用 POJO 来解析 JSON。是否可以在不使用 POJO 类的情况下解析这个 json 数组?
【解决方案2】:

如果您确信 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 条目,这将变得容易受到攻击。

【讨论】:

  • 我可以在 API 调用中拥有多个数组。我如何解析每个数组以在此方法中启动 REST 调用。
【解决方案3】:

如果您使用的是 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);
        }
}

这里我只为“问题”做,同样你也可以说“答案”,“权威”,以防你提到的网址http://api.statdns.com/google.com/cname。

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

【讨论】:

  • 感谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 2020-01-18
  • 2017-01-04
  • 1970-01-01
  • 2012-07-05
相关资源
最近更新 更多