如何使用 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);
}
}
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);
}
}