【问题标题】:Parsing Nested JSON in java without know structure of JSON?在不知道 JSON 结构的情况下解析 Java 中的嵌套 JSON?
【发布时间】:2015-10-29 05:54:43
【问题描述】:

我正在尝试解析嵌套的 JSON,但我不知道 JSON 的格式...我想要 JSON 的所有键和值。

例子:

{
    "txnSpecificData1": "11",
    "txnSpecificData2": "21",
    "merchantData": {
        "merchantSpecificData1": "111",
        "merchantSpecificData2": "222",
        "merchantSpecificData3": {
            "data1": "1",
            "data2": "2"
        }
    }
}

现在我想要所有的键和它们的值...我试过 JSONParser 但它没有给出所有的键。 请有人指导我这样做。

我需要基于键的值.. 假设如果我将密钥指定为“merchantSpecificData2”,它应该返回我的值。

O/P 应该是包含所有 Key 和 Values 的 MAP:

OutPut Map : : : {txnSpecificData1=11, txnSpecificData1=22, merchantSpecificData1=111, merchantSpecificData2=222,data1=1,data2=2}

【问题讨论】:

  • 您的问题格式不正确。从{"a": 1, "b": {"a": 2}} 请求"a" 应该给出什么结果?
  • @Eric 我希望所有带有值的键都存储在地图中。 txnSpecificData1:11 txnSpecificData2:21 商家具体数据1:111 商家具体数据2:222 明智
  • 你刚刚忽略了我的问题,并且更不清楚地重申了你的问题。注意我在上面给出的“地图”中,键“a”出现了两次。你想要哪个值,为什么?
  • @Eric..在我的情况下没有重复的键..你为什么问我这个?
  • 你特别说你“不知道钥匙”。那么你怎么知道它们都是独一无二的呢?

标签: java json parsing json-patch


【解决方案1】:

将所有键和相应值存储到映射中的迭代解决方案。请注意,所有异常情况均未处理。

public static void main(String[] args) throws Exception{
    JSONObject jo = new JSONObject(your_json_String_here);
    Map<String, String> map = new HashMap<String, String>(); 
    new Test().iterateJson(jo, map);
    System.out.println(map);
}
public void iterateJson(JSONObject jo, Map map) {
    for(Object o : jo.keySet()){
        if(jo.get(o.toString()) instanceof JSONObject) 
            iterateJson(jo.getJSONObject(o.toString()), map);
        else
            map.put(o.toString(), jo.get(o.toString()));
    }
}

【讨论】:

  • 不适合我的情况
  • 此示例根据您的请求打印 JSON 字符串中可用键的所有值。如果您的要求略有不同,预计会进行一些修改,请详细说明您卡在哪里
  • 我稍微修改了代码,现在它正在填充所有键值对的映射,您可以使用该映射获取任何键的值
【解决方案2】:

请参考this

示例代码

public static void main(String[] args) throws JSONException {
        String json = "{\"txnSpecificData1\": \"11\",\"txnSpecificData2\": \"21\",\"merchantData\": {\"merchantSpecificData1\": \"111\",\"merchantSpecificData2\": \"222\",\"merchantSpecificData3\": {\"data1\": \"1\",\"data2\": \"2\"}}}";

        JSONObject jsonObject = new JSONObject(json);
        JSONObject merchantData = (JSONObject) jsonObject.get("merchantData");
        System.out.println(merchantData.get("merchantSpecificData2"));
    }

输出

222

Jar

Maven

Refer hew for more details.

【讨论】:

  • ...我已经这样做了..但正如我所说我不知道​​格式..我的意思是代替“merchantData”它可以是任何东西
  • @user2888996 可能使用 Regex 看起来很奇怪,但可能会解决
  • 好的...如果我只使用这个..那么我怎样才能找到键“txnSpecificData1”的值
  • jsonObject.get("txnSpecificData1");,你也可以一直递归jsonObject,检查它是数组还是对象
  • @ ankur-singhal ...我希望所有键都以其各自的值存储在 Map 中。我不知道任何键以及嵌套级别
【解决方案3】:

您可以使用http://json-lib.sourceforge.net/apidocs/net/sf/json/package-summary.html 来解析 JSON。使用 JSONSerializer 您可以获得解析字符串的 JSONObject。然后 JSONObject 中可用的方法将为您提供所有键和值。值可以很简单,例如 String/Long/Boolean,也可以很复杂,例如另一个 JSONObject/JSONArray。

【讨论】:

  • ..这个库我没有使用,我也不知道如何实现。
【解决方案4】:

这是解决方案..

private static HashMap print(final JsonNode node) throws IOException {
        HashMap map = new HashMap();
        Iterator<Map.Entry<String, JsonNode>> fieldsIterator = node.getFields();

        while (fieldsIterator.hasNext()) {
            Map.Entry<String, JsonNode> field = fieldsIterator.next();
            final String key = field.getKey();

            final JsonNode value = field.getValue();
            if (value.isContainerNode()) {
                print(value);
            } else {
                map.put(key, value);
            }
        }
        return map;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多