我想使用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));
}
但这只会返回“产品”
答案 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的影响。