如何将嵌套的JsonObjects作为JSON字符串遍历?

时间:2019-04-14 19:53:23

标签: java json

我想使用RestTemplate提取title的值,然后 JsonObject,但似乎无法对其进行迭代。我正在寻找通过其键和值检索每个对象。我也尝试了一些诸如Gson解析之类的事情,并且所有返回乘积都是唯一的键。

这是我的JSON字符串:

{  
  "product":{  
    "old_labels":{  },
    "available":{  },
    "item":{  
      "tcin":"13860428",
      "bundle_components":{  },
      "dpci":"058-34-0436",
      "upc":"025192110306",
      "product_description":{  
        "title":"Jason Bourne",
        "bullet_description":[  
          "<B>Movie Studio:</B> Universal Studios",
          "<B>Movie Genre:</B> Thriller",
          "<B>Software Format:</B> Blu-ray"
        ]
      },
    }
  }
}

这是我的代码:

JSONObject product = (JSONObject) jsonObject.get("product"); 
JSONObject item = (JSONObject) product.get("item");
JSONObject product_description = (JSONObject) 
item.get("product_description");
String title = (String) product_description.get("title");
// returns Jason Bourne 

需要动态执行此操作:

Set<String> keys = jsonObject.keySet();
for(Iterator iterator = keys.iterator(); iterator.hasNext();) {
     String key = (String) iterator.next();
     System.out.println(jsonObject.get(key));
}

但这只会返回“产品”

2 个答案:

答案 0 :(得分:0)

尝试一下,看看它是否是您想要的:

public static void main(String[] args) {
  String filePath = "../json_content.json";
  try {
    JSONParser jsonNParser = new JSONParser();
    String contentJSON = new String(Files.readAllBytes(Paths.get(filePath)));
    JSONObject objectData = (JSONObject) jsonNParser.parse(contentJSON);
    System.out.println(objectData);

    Set<String> keys = objectData.keySet();
    for (String key : keys) {
      Object keyValueObject = objectData.get(key);
      parseJSONObject(key, keyValueObject);
    }
  } catch (ParseException | IOException ioex) {
    System.out.println(ioex);
  }
}

private static void parseJSONObject(String key, Object keyValue) {
  if (keyValue instanceof JSONObject) {
    JSONObject nextItems = (JSONObject) keyValue;
    Set<String> keySet = nextItems.keySet();
    for (String keyS : keySet) {
      Object objectValue = nextItems.get(keyS);
      parseJSONObject(keyS, objectValue);
    }
  } else if (keyValue instanceof JSONArray) {
    JSONArray objectValueArr = (JSONArray) keyValue;
    String arr = String.join(" | ", objectValueArr);
    System.out.println("Key :: " + key + ", Values :: " + arr);
  } else if (keyValue instanceof String) {
    System.out.println("Key :: " + key + ", Value :: " + keyValue);
  }
}

答案 1 :(得分:0)

如果json数据的结构定义得很好,并且始终是您所描述的方式,那么可以将嵌套数据结构与Jackson的JsonNode一起使用,如下所示:

public static void main(String[] args) {
  try {
    String filePath = "../json_data";
    String contentJSON = new String(Files.readAllBytes(Paths.get(filePath)));
    JsonNode productNode = new ObjectMapper().readTree(contentJSON);
    String title = Stream.of(productNode.get("product"))
      .map(item -> item.get("item"))
      .map(pc -> pc.get("product_description"))
      .map(t -> t.get("title"))
      .map(Object::toString)
      .collect(Collectors.joining());
    System.out.println(title);
  } catch (IOException ioex) {
    System.out.println(ioex);
  }
}

使用此结构,您可以直接提取标题,而无需使用递归。但是,如果json中不存在其中一个属性以到达标题,则代码易受NullPointerException的影响。