首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析一个非常复杂的嵌套json,其结构在JAVA中总是在变化

解析一个非常复杂的嵌套json,其结构在JAVA中总是在变化
EN

Stack Overflow用户
提问于 2014-07-07 16:26:37
回答 2查看 1.6K关注 0票数 1

我有一个非常复杂的嵌套json,它的结构总是在变化。我希望在JAVA中解析它,以便可以使用键/字段名检索任何元素。

选项1-最简单的方法是将json转换/解析为JAVA对象。我什么都试过了(葛森,JSONObject,杰克逊.)但是,我不能转换json,除非我已经准备好了一个java类,而且由于json没有遵循固定的结构,所以我不能将它转换为JAVA类。还有其他库可以将json转换为java对象吗?(不需要使用预先存在的java类将json转换为)

选项2-或者有一种我可以使用的方法/库,如果给出一部分json,程序就会打印json文件中的所有元素。就像这样..。

代码语言:javascript
运行
复制
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
        }]}

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-08 17:20:21

好的,我找到了解决办法!我用了杰克逊分析器

首先将jsonString映射到JsonNode

代码语言:javascript
运行
复制
JsonNode rootNode = mapper.readValue(jsonString, JsonNode.class);

更新rootNode以包含所需密钥的json:

代码语言:javascript
运行
复制
    rootNode = rootNode.findParent(key);

然后取决于它是数组还是列表,分别处理它:

代码语言:javascript
运行
复制
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是数组还是列表。如果它是一个列表,则以不同的方式处理它(只需对键值对进行迭代,如下所示)

代码语言:javascript
运行
复制
for (Iterator<String> keyArray = rootNode.getFieldNames(); keyArray.hasNext();){
        fieldName = keyArray.next();
        fieldValue = rootNode.get(fieldName).asText();
        System.out.println(fieldName + " = " + fieldValue);
    }

每次迭代之后,检查下一个jsonNode是什么,并递归地调用相应的处理程序。

票数 1
EN

Stack Overflow用户

发布于 2014-07-07 16:29:32

尝试使用简简单单将JSON解析为一组嵌套的JSONObject (基本上是映射)和JSONArray (基本上是列表)元素,并自己提取值。

只是一个节点:PrimaryAddress表示可能也有一个SecondaryAddress,所以嵌套不应该改变,否则可能很难确定StreetAddressLine属于哪个地址。

在这种情况下,更好的问题是:为什么结构变化那么频繁?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24615353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档