未知字段名时解析json对象

Parse jsonObject when field names are unknowm

我正在尝试从 JsonObject 中提取一些数据。 问题是 json 中的字段具有不可预测的名称。

如何提取具有这种奇怪字段名称的信息?

这是一个例子:

 "myObject":{  
          "216cfa89a2de57554b36b177f0bfbb05":{  

           },
           "0cf9182b5ceba2cb64174141a13e647d":{  

           },
           "eb1d1b19e117ba1387a798d9194b4660":{  

           },
           "157b52871e8e560c7ec0be111ef02363":{  

           },
           "4db69dd3a8ae8e0089bd2959ab0c5f86":{  

           },
}

我正在使用 gson,其中有方法 getAsJsonObject,但如果我不知道字段名称,我该如何使用它?

JsonObject jsonObject= myObjectJsonObject.getAsJsonObject("???");    

另外,字段的数量可以是可变的,这也是一个问题。 我想知道为什么我没有得到一个 json 数组作为响应,它会更合适并且我可以那样解析它。

如果您查看 this post,您会发现您可以简单地执行以下操作:

Object o = new Gson().fromJson(json, Object.class);

返回的对象是 String 的 Map 和 String 或 Map。

在你的情况下最好使用 JsonPath

与 JSON 像这样:

{
  "myObject": {
    "216cfa89a2de57554b36b177f0bfbb05": {
      "field1": true
    },
    "0cf9182b5ceba2cb64174141a13e647d": {
      "field2": true
    },
    "eb1d1b19e117ba1387a798d9194b4660": {
      "field3": true
    },
    "157b52871e8e560c7ec0be111ef02363": {
      "field2": true
    },
    "4db69dd3a8ae8e0089bd2959ab0c5f86": {
      "field5": true
    }
  }
}

以及 JsonPth 的表达式

$.myObject.*

你会得到一个字段数组

[
  {
    "field1": true
  },
  {
    "field2": true
  },
  {
    "field3": true
  },
  {
    "field2": true
  },
  {
    "field5": true
  }
]

希望有所帮助:)

JsonObject o = new JsonParser().parse("some json string").getAsJsonObject();

使用 JsonObject.entrySet().

    String json = "{ 'abcd': { 'a':'d' }, 'dcba': { 'd':'a' } }";
    JsonObject o = new JsonParser().parse(json).getAsJsonObject();

    for(Map.Entry<String, JsonElement> entry : o.entrySet()) {
        System.out.println(entry.getKey());
        System.out.println(entry.getValue());
    }

或者您可以在加载对象时获取地图:

    Map<String, JsonObject> map = new Gson().fromJson(json, new TypeToken<Map<String, JsonObject>>(){}.getType());
    for(Map.Entry e : map.entrySet()) {
        System.out.println(e.getKey());
        System.out.println(e.getValue());
    }
}

或者您可以添加一个 JsonDeserializer,它可以将您的 class 反序列化为合理的东西(可能是地图)。