【问题标题】:How to parse a complex json using gson or jackson如何使用 gson 或 jackson 解析复杂的 json
【发布时间】:2015-07-15 11:27:45
【问题描述】:

Json 字符串如下所示:

[
    {
         "Metric Payload": [
            {
                "MetaData": [
                    {
                        "FieldName": "PROC_PROC_ID",
                        "DataType": "UINT32",
                        "Label": "PID",
                        "Unit": "N/A"
                    },
                    {
                        "FieldName": "PROC_USER_NAME",
                        "DataType": "STRING",
                        "Label": "User Name",
                        "Unit": "N/A"
                    }
                ],
                "Instances": [
                    {
                        "PROC_INTEREST": "M",
                        "PROC_CPU_TOTAL_UTIL": "0.0",
                        "GBL_ACTIVE_CPU": "2"                        
                    }
                ]
            }
        ]
    }
]

我想解析并提取“实例”数组中存在的“PROC_CPU_TOTAL_UTIL”的值。尝试了下面的代码,但它失败并显示异常,不是 JSON 对象。

    public String getmetrics(String jsonout) {
            String result = null;
            try {

                JsonElement jelement = new JsonParser().parse(jsonout);         
                JsonObject  jobject = jelement.getAsJsonObject();
                jobject = jobject.getAsJsonObject("");
                JsonArray jarray = jobject.getAsJsonArray("Instances");

                jobject = jarray.get(0).getAsJsonObject();
                result = jobject.get("GBL_MEM_AVAIL").toString();
                System.out.println(result);



            } catch (Exception e) {
                // TODO: handle exception
                System.err.println(e);
            }
            return result;


        }

【问题讨论】:

  • GBL_MEM_AVAIL 在哪里

标签: java json parsing gson


【解决方案1】:

在您的示例中,最外面的括号格式错误。 我不确定这是您问题的根本原因,但 json 对象被封装在旋转括号内。 丢掉最外面的方括号开始...

【讨论】:

  • 或使用JsonElement.getAsJsonArray() 代替JsonElement.getAsJsonObject()
【解决方案2】:

尽管缺少 GBL_MEM_AVAIL (我想你无意中遗漏了它),但你必须遵循你的 JSon 对象的路径。即您正在访问作为 Metric Payload 子级的实例。

所以首先获取有效载荷:

JsonArray payloads = jobject.getAsJsonArray("Metric Payload");

payload 上的第一个实例:

JsonArray instances = payloads.get(0).getAsJsonObject().getAsJsonArray("Instances");

然后是实例的第一次出现:

jobject = instances.get(0).getAsJsonObject();

如果您想获取所有负载上的所有实例,则必须引入循环。

这是一个您可以试验的有效 json(复制粘贴到您的编辑器):

public class TestJson {

  @Test
  public void testIt(){
    String x = "\n" +
      "    {\n" +
      "         \"Metric Payload\": [\n" +
      "            {\n" +
      "                \"MetaData\": [\n" +
      "                    {\n" +
      "                        \"FieldName\": \"PROC_PROC_ID\",\n" +
      "                        \"DataType\": \"UINT32\",\n" +
      "                        \"Label\": \"PID\",\n" +
      "                        \"Unit\": \"N/A\"\n" +
      "                    },\n" +
      "                    {\n" +
      "                        \"FieldName\": \"PROC_USER_NAME\",\n" +
      "                        \"DataType\": \"STRING\",\n" +
      "                        \"Label\": \"User Name\",\n" +
      "                        \"Unit\": \"N/A\"\n" +
      "                    }\n" +
      "                ],\n" +
      "                \"Instances\": [\n" +
      "                    {\n" +
      "                        \"PROC_INTEREST\": \"M\",\n" +
      "                        \"PROC_CPU_TOTAL_UTIL\": \"0.0\",\n" +
      "                        \"GBL_ACTIVE_CPU\": \"2\"                        \n" +
      "                    }\n" +
      "                ]\n" +
      "            }\n" +
      "        ]\n" +
      "    }\n" +
      "";
    getmetrics(x);
  }

  public void getmetrics(String jsonout) {
    String result = null;

    JsonElement jelement = new JsonParser().parse(jsonout);
    JsonObject jobject = jelement.getAsJsonObject();
    JsonArray payloads = jobject.getAsJsonArray("Metric Payload");
    JsonArray instances = payloads.get(0).getAsJsonObject().getAsJsonArray("Instances");
    jobject = instances.get(0).getAsJsonObject();
    System.out.println(jobject);
    result = jobject.get("PROC_CPU_TOTAL_UTIL").toString();
    System.out.println(result);
  }
}

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    相关资源
    最近更新 更多