java - 通过 JSONObject 递归解析 JSON 以针对特定键获取值

标签 java json

我有一个复杂的 JSON,如下所示,我需要对其进行递归解析。递归的最终结果是 Map> type of object,其中 key 是 audience-name value,内部 map 是 Text-key,Title-value。 这只是完整 JSON 的一部分。

"sections": {
  "1": {
    "1": {
      "1": {
        "title": "xxx",
        "text": "xxx",
        "tags": {
          "audience": {
            "1": {
              "name": "xxx",
              "title": "xxx",
              "id": "xxx"
            }
          },
          "styleHint": {
            "1": {
              "name": "xxx",
              "title": "xxx",
              "id": "xxx"
            }
          }
        }
      },
      "title": "xxx",
      "text": "xxx",
      "tags": {
        "audience": {
          "1": {
            "name": "xxx",
            "title": "xxx",
            "id": "xxx"
          }
        },
        "styleHint": {
          "1": {
            "name": "xxx",
            "title": "xxx",
            "id": "xxx"
          }
        }
      }
    },
    "2": {
      "title": "xxx",
      "text": "xxx",
      "tags": {
        "audience": {
          "1": {
            "name": "xxx",
            "title": "xxx",
            "id": "xxx"
          }
        },
        "styleHint": {
          "1": {
            "name": "xxx",
            "title": "xxx",
            "id": "xxx"
          }
        }
      }
    },
    "title": "xxx",
    "text": "xxx",
    "tags": {
      "audience": {
        "1": {
          "name": "xxx",
          "title": "xxx",
          "id": "xxx"
        },
        "2": {
          "name": "xxx",
          "title": "xxx",
          "id": "xxx"
        }
      },
      "styleHint": {
        "1": {
          "name": "xxx",
          "title": "xxx",
          "id": "xxx"
        }
      }
    }
  },
  "2": {
    "title": "xxx",
    "text": "xxx",
    "tags": {
      "audience": {
        "1": {
          "name": "xxx",
          "title": "xxx",
          "id": "xxx"
        }
      },
      "styleHint": {
        "1": {
          "name": "xxx",
          "title": "xxx",
          "id": "xxx"
        }
      }
    },
    "anchor":"xxx"

  },
  "3": {
    "1": {
      "title": "xxx",
      "text": "xxx",
      "tags": {
        "audience": {
          "tag": {
            "name": "xxx",
            "title": "xxx",
            "id": "xxx"
          }
        },
        "styleHint": {
          "tag": {
            "name": "xxx",
            "title": "xxx",
            "id": "xxx"
          }
        }
      }
    },
    "title": "xxx",
    "text": "xxx",
    "tags": {
      "audience": {
        "1": {
          "name": "xxx",
          "title": "xxx",
          "id": "xxxx"
        }
      },
      "styleHint": {
        "1": {
          "name": "xx",
          "title": "xxx",
          "id": "xxxx"
        }
      }
    }
  }  
}

我为此使用 JSONObject 只是为了很晚才意识到迭代以相反的顺序发生:(

我试图递归地解析整个结构并将其反转以对我有利。但是订单正在失控 :( :( 主要是因为文本、标题、片段跟在第二个文本、标题之后并且有 2 个听众姓名。该部分的文本和标题被跳过,导致整个订单受到影响

请帮忙!!我目前的实现如下

private Map<String, Map<String, String>> parseTextAndTitle(JSONObject json,
        Map<String, Map<String, String>> ttMap, String article,
        List<String> usrGrp) throws JSONException {
    logger.info("Entering method..");
    String userGroup = null;
    Map<String, String> titleAndText = new LinkedHashMap<String, String>();
    Map<String, String> currMap = new LinkedHashMap<String, String>();
    Map<String, String> tempMap = new LinkedHashMap<String, String>();  

    Iterator<String> keys = json.sortedKeys();

    while (keys.hasNext()) {
        String key = keys.next();
        JSONObject value = null;String firstKey = null;
        String text = null;String title = null;
        int length = 0;
        try {
            value = json.getJSONObject(key);
            if (key.equalsIgnoreCase(STYLEHINT) || key.equalsIgnoreCase(ANCHOR)
                    || key.equalsIgnoreCase(INLINE)) {
                continue;
            }
            if (key.equals(TEXT)) {
                text = json.getString(key);
                text = removeHtmlTag(text);
                logger.debug("TEXT RETRIEVED:" + text);
                if(text != null) {
                    titleAndText.put(text, "");
                }
                else
                    logger.debug("Text not retrieved!!");
            }
            if (key.equals(TITLE)) {
                title = json.getString(TITLE);
                title = appendNewline(title);
                logger.debug("TITLE RETRIEVED:" + title);
                if (title != null) {
                    for (Map.Entry<String, String> iter : titleAndText
                            .entrySet())
                        firstKey = iter.getKey();
                    if(firstKey != null) {
                        titleAndText.put(firstKey, title);
                    }
                    else
                        logger.debug("NO key present in textAndTitle Map!!");
                }
            }
            if (key.equals(AUDIENCE_TAG)) {
                try {
                    length = value.length();
                    for (int i = 0; i < length; i++) {
                        userGroup = (String) value.getJSONObject(
                                String.valueOf(i + 1)).get(NAME);
                        logger.debug("USERGROUP RETRIEVED:" + userGroup);
                        usrGrp.add(userGroup);
                    }

                } catch (Exception e) {
                    userGroup = (String) value.getJSONObject(TAG).get(NAME);
                    logger.debug("USERGROUP RETRIEVED:" + userGroup);
                    usrGrp.add(userGroup);
                }
            }
            else{
                parseTextAndTitle(value, ttMap, article, usrGrp);
            }
        } catch (Exception e) {
            logger.debug("value not a JSON Object..rather an element");
            // Extract the text values
            if (key.equals(TEXT)) {
                text = json.getString(key);
                text = removeHtmlTag(text);
                logger.debug("TEXT RETRIEVED:" + text);
                if(text != null) {
                    titleAndText.put(text, "");
                }
                else
                    logger.debug("Text not retrieved!!");
            }
            if (key.equals(TITLE)) {
                title = json.getString(TITLE);
                title = appendNewline(title);
                logger.debug("TITLE RETRIEVED:" + title);
                if (title != null) {
                    for (Map.Entry<String, String> iter : titleAndText
                            .entrySet())
                        firstKey = iter.getKey();
                    if(firstKey != null) {
                        titleAndText.put(firstKey, title);
                    }
                    else
                        logger.debug("NO key present in textAndTitle Map!!");
                }
            }
        }
        if (!(usrGrp.isEmpty()) && !(titleAndText.isEmpty())
                && title != null) {
            if(usrGrp.size() > 1)
            {
                for(int i=0;i<usrGrp.size();i++)
                {
                    //If user group already present, extract current text,title map
                    //If not put usergroup as key, text,title map as value
                    if (ttMap.containsKey(usrGrp.get(i))) {
                        currMap = ttMap.get(usrGrp.get(i));
                        if (currMap.isEmpty()) {
                            ttMap.put(usrGrp.get(i), titleAndText);

                        } else {
                            currMap = ttMap.get(usrGrp.get(i));
                            for (Map.Entry<String, String> entry : currMap
                                    .entrySet()) {
                                tempMap.put(entry.getKey(),
                                        (String) entry.getValue());
                            }
                            for (Map.Entry<String, String> ttEntry : titleAndText
                                    .entrySet()) {
                                tempMap.put(ttEntry.getKey(),
                                        (String) ttEntry.getValue());
                            }
                            ttMap.put(usrGrp.get(i),tempMap);
                            //                          titleAndText = new LinkedHashMap<String, String>();
                            tempMap = new LinkedHashMap<String, String>();
                        }
                    }                       
                    else {
                        ttMap.put(usrGrp.get(i), titleAndText);
                    }
                }
                titleAndText.clear();

            }
            else
            {
                if (ttMap.isEmpty())
                {
                    tempMap = titleAndText;
                    ttMap.put(usrGrp.get(0), tempMap);
                }
                else {
                    currMap = ttMap.get(usrGrp.get(0));
                    if (currMap.isEmpty()) {
                        ttMap.put(usrGrp.get(0), titleAndText);
                    }else {
                        currMap = ttMap.get(usrGrp.get(0));
                        for (Map.Entry<String, String> entry : currMap
                                .entrySet()) {
                            tempMap.put(entry.getKey(),
                                    (String) entry.getValue());
                        }
                        for (Map.Entry<String, String> ttEntry : titleAndText
                                .entrySet()) {
                            tempMap.put(ttEntry.getKey(),
                                    (String) ttEntry.getValue());
                        }
                        ttMap.put(usrGrp.get(0),tempMap);
                        titleAndText.clear();

                    }
                }

            }
            usrGrp.clear();


        }

    }

    logger.info("Exiting method..");
    return ttMap;
}

最佳答案

修改@sklimkovitch 代码以使其在一些复杂的 Json 结构中工作...

public void loopThroughJson(Object input) throws JSONException {

    if (input instanceof JSONObject) {

        Iterator<?> keys = ((JSONObject) input).keys();

        while (keys.hasNext()) {

            String key = (String) keys.next();

            if (!(((JSONObject) input).get(key) instanceof JSONArray))
                if (((JSONObject) input).get(key) instanceof JSONObject) {
                    loopThroughJson(((JSONObject) input).get(key));
                } else
                    System.out.println(key + "=" + ((JSONObject) input).get(key));
            else
                loopThroughJson(new JSONArray(((JSONObject) input).get(key).toString()));
        }
    }

    if (input instanceof JSONArray) {
        for (int i = 0; i < ((JSONArray) input).length(); i++) {
            JSONObject a = ((JSONArray) input).getJSONObject(i);
            loopThroughJson(a);
        }
    }

}

关于java - 通过 JSONObject 递归解析 JSON 以针对特定键获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21354546/

相关文章:

c# - Json.NET JsonConvert.DeserializeObject() 返回空值

javascript - 在 python (Django) 中读取 Json

java - jni getMethodID 用于获取构造函数 ID 时返回 Null

java - 使用特定于版本的 stub

php - 如何检查 mysql 表的 bool 字段以及在 php 中将 0 或 1 值转换为 true/false

javascript - JSON日期,显示服务器时区的原始日期

json - Swift 4 json解码器错误flickr

java.lang.NoClassDefFoundError : org/apache/logging/log4j/Logger 错误

java - tomcat无法更新新编译的java文件

java - 在 Jtable 中显示记录的问题