【问题标题】:Key value pair in Java from JSON file来自 JSON 文件的 Java 中的键值对
【发布时间】:2018-06-12 19:36:44
【问题描述】:

我有一个 JSON 数据

{
"HiServiceInquiryResponse": {
    "CoverageInfoResponse": {
        "Participant": {
            "ns1:PersonalInfo": {
                "ns1:LastName": "AA",
                "ns1:Address": [
                    {
                        "ns1:Province": "",
                        "ns1:State": "CA",
                        "ns1:City": "LOS ANGELES",
                        "ns1:Country": "US",
                        "ns1:Address2": "",
                        "ns1:Address1": "test",
                        "ns1:PostalCode": 12345
                    },
                    {
                        "ns1:Province": "",
                        "ns1:State": "CA",
                        "ns1:City": "LOS ANGELES",
                        "ns1:Country": "US",
                        "ns1:Address2": "",
                        "ns1:Address1": "test",
                        "ns1:PostalCode": 12345
                    }
                ],
                "ns1:FirstName": "BB"
            },
            "ns1:Coverage": "",
            "ns1:HiClientId": 57,
            "ns1:Employment": {
                "ns1:EmployeeId": 1234,
                "ns1:TaxId": 111
            }
        }
    }
}

}

我想读取所有键值对并存储它们。到目前为止,我能够做到

    public static void printJsonObject(JSONObject jsonObj) {

    for (Object key : jsonObj.keySet()) {
        String keyStr = (String) key;
        Object keyvalue = jsonObj.get(keyStr);

        if (!(keyvalue instanceof JSONObject)) {
            System.out.println(keyStr + ", " + keyvalue);
        }
        if (keyvalue instanceof JSONObject) {
            printJsonObject((JSONObject) keyvalue);
        }
    }
}

问题是当我们在personalInfo中有2个地址时,它不会单独读取它们。

只有 1 个地址时的我的输出:->

    ns1:LastName, AA
    ns1:Province, 
    ns1:State, CA
    ns1:City, LOS ANGELES
    ns1:Country, US
    ns1:Address2, 
    ns1:Address1, test
    ns1:PostalCode, 12345
    ns1:FirstName, BB
    ns1:Coverage, 
    ns1:HiClientId, 57
    ns1:EmployeeId, 1234
    ns1:TaxId, 111

当有 2 个地址时我的输出:->

    ns1:LastName, AA
    ns1:Address, [{"ns1:Province":"","ns1:State":"CA","ns1:City":"LOS ANGELES","ns1:Country":"US","ns1:Address2":"","ns1:Address1":"test","ns1:PostalCode":12345},{"ns1:Province":"","ns1:State":"CA","ns1:City":"LOS ANGELES","ns1:Country":"US","ns1:Address2":"","ns1:Address1":"test","ns1:PostalCode":12345}]
    ns1:FirstName, BB
    ns1:Coverage, 
    ns1:HiClientId, 57
    ns1:EmployeeId, 1234
    ns1:TaxId, 111

我希望显示两个地址的数据。

【问题讨论】:

  • 考虑使用 Jackson。没有什么国产产品会比现有的、经过良好测试的产品更好。
  • 我无法使用 Jackson 这样做,我是 java 新手
  • 它可以按来的顺序打印数据吗?
  • Json 与订单无关。应该没关系。

标签: java json


【解决方案1】:

要解析JSONObject 中的数组,您必须检查JSONArray 的值实例并为每个数组项递归调用printJsonObject:

public static void printJsonObject(JSONObject jsonObj) {
    for (Object key : jsonObj.keySet()) {
        Object value = jsonObj.get(key);

        if (value instanceof JSONObject)
            printJsonObject((JSONObject)value);
        else if (value instanceof JSONArray)
            ((JSONArray)value).forEach(obj -> printJsonObject((JSONObject)obj));
        else
            System.out.println(key + ", " + value);
    }
}

【讨论】:

  • 它可以按来的顺序打印数据吗?
  • 是的。它保存值的顺序。
【解决方案2】:

这应该可以解决您的问题

public static void printJsonObject(JSONObject jsonObj) {

        for (Object key : jsonObj.keySet()) {
            String keyStr = (String) key;
            Object keyvalue = jsonObj.get(keyStr);

            if (keyvalue instanceof JSONObject) {
                printJsonObject((JSONObject) keyvalue);
            } else if (keyvalue instanceof JSONArray) {
                JSONArray array = (JSONArray) keyvalue;
                for (int i = 0; i < array.length(); i++) {
                    printJsonObject((JSONObject) array.get(i));
                }

            } else {
                System.out.println(keyStr + ", " + keyvalue);
            }
        }
    }

【讨论】:

  • 像魅力一样工作。 ! for (int i = 0; i
  • 它可以按来的顺序打印数据吗?
【解决方案3】:

将您的代码更改为

  if (!(keyvalue instanceof JSONObject)) {

    if(keyStr.equals("ns1:Address")){

        //now it is your array so loop through it and call printJsonObject((JSONObject) keyvalue); on each object

    }
    else{
        System.out.println(keyStr + ", " + keyvalue);
    }
    }

【讨论】:

    【解决方案4】:

    这是因为当有两个地址时,地址对应的JSONObject是一个数组。如果要单独打印,请检查是否为instanceOf JSONArray。然后解析数组中的不同地址。如果不是数组,直接打印即可。

    【讨论】:

      猜你喜欢
      • 2022-11-28
      • 2021-09-26
      • 1970-01-01
      • 2020-03-23
      • 2015-11-09
      • 2016-06-16
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多