如何使用 gson 或 jackson 解析复杂的 json

How to parse a complex json using gson or jackson

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"                        
                    }
                ]
            }
        ]
    }
]

我想解析并提取 "Instances" 数组中存在的 "PROC_CPU_TOTAL_UTIL" 的值。尝试了下面的代码,但它失败了,异常说,NOT a JSON object.

    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;


        }

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

尽管 GBL_MEM_AVAIL 丢失了(我想你无意中遗漏了它),但你必须遵循 JSon 对象的路径。即您正在访问的实例是公制有效负载的子实例。

所以首先获取有效载荷:

JsonArray payloads = jobject.getAsJsonArray("Metric 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);
  }
}