我有一个非常复杂的嵌套json,其结构总是在变化。我想在JAVA中解析它,这样我就可以使用键/字段名检索任何元素。
选项1 -最简单的方法是将json转换/解析为JAVA对象。我已经尝试了所有的方法(gson, JSONObject, Jackson…)但我不能转换json,除非我有一个java类准备好,因为json不遵循一个固定的结构,我不能转换成java类。是否有其他库可以将json转换为java对象?(不需要预先存在的java类将json转换为)
选项2 -或者有一种方法/库我可以使用,如果给出json的一部分,程序打印json文件中的所有元素。像这样…
StreetAddressLine
PrimaryTownName : value
CountryISOAlpha2Code :value
TerritoryAbbreviatedName :value
PostalCode : value
{"PrimaryAddress": [ {
"StreetAddressLine": [{"LineText": "492 Koller St"}],
"PrimaryTownName": "San Francisco",
"CountryISOAlpha2Code": "US",
"TerritoryAbbreviatedName": "CA",
"PostalCode": "94110",
"AddressUsageTenureDetail": [{"TenureTypeText": {
"@DNBCodeValue": 1129,
"$": "Rents"
}}],
"PremisesUsageDetail": [{"PremisesUsageFunctionDetail": [{"PremisesFunctionText": {
"@DNBCodeValue": 12058,
"$": "Manufacturing"
}}]}],
"CountyOfficialName": "San Francisco County",
"TerritoryOfficialName": "California",
"CountryGroupName": "North America",
"GeographicalPrecisionText": {
"@DNBCodeValue": 0,
"$": "Unknown"
},
"UndeliverableIndicator": false,
"MetropolitanStatisticalAreaUSCensusCode": ["San Francisco-Oakland-Hayward CA"],
"RegisteredAddressIndicator": false,
"ResidentialAddressIndicator": false
}]}
非常感谢!
尝试使用JSON -simple将JSON解析为一堆嵌套的JSONObject
(基本上是映射)和JSONArray
(基本上是列表)元素并自己提取值。
只是一个节点:PrimaryAddress
表示可能也有SecondaryAddress
,所以嵌套不应该改变,否则可能很难确定StreetAddressLine
属于哪个地址。
我找到了一个解决方案!我使用了Jackson解析器
首先将jsonString映射到JsonNode
JsonNode rootNode = mapper.readValue(jsonString, JsonNode.class);
更新rootNode以包含所需密钥的json:
rootNode = rootNode.findParent(key);
,然后根据它是数组还是列表分别处理它:
if(rootNode.path(key).isArray()){
//key is the field in the json that you might be looking for
for (final JsonNode objNode : rootNode) {
for (Iterator<String> keyArray = objNode.getFieldNames(); keyArray.hasNext();){
fieldName = keyArray.next();
fieldValue = objNode.path(fieldName).asText();
if(fieldValue != ""){
System.out.println(fieldName + " = " + fieldValue);
}else{
arrayHandler(objNode,fieldName);
}
}
}
在每次迭代时检查结果JsonNode是数组还是列表。如果它是List,则以不同的方式处理它(只需像这样迭代键值对)
for (Iterator<String> keyArray = rootNode.getFieldNames(); keyArray.hasNext();){
fieldName = keyArray.next();
fieldValue = rootNode.get(fieldName).asText();
System.out.println(fieldName + " = " + fieldValue);
}
每次迭代后检查下一个jsonNode是什么并递归地调用相应的处理程序…