Json解析:如何使用Gson来获取“ body数组”中的“ body”数据(或者在其他Java库或支持的表示法中更好)?

时间:2019-11-26 10:37:34

标签: java json java-8 gson json-simple

我的Rest API返回以下响应,其中仅需要内部列表,所有数据都将被丢弃:

{
  "meta": [],
  "links": [],
  "body": [
    {
      "meta": [],
      "links": [],
      "body": {
        "field1": "value1",
        "fieldn": "valuen"
      } // <-----
    },
    {
      "meta": [],
      "links": [],
      "body": {
        "field1": "value1",
        "fieldn": "valuen"
      } // <-----
    }
  ]
}

Gson或另一个其他Java库中是否有任何方法可以获取主体数组或执行此操作的直接方法?或者甚至使用Java 8标准?

或者,我应该使用如下的标准迭代器:

//Old way to do this
JSONArray BodyArr = (JSONArray) jsonObject.get("Body");
Iterator<JSONObject> itBody = BodyArr.iterator();
int teller = 0;
while (itBody.hasNext()) {
  JSONObject bodyObj = itBody.next();
  JSONObject body = (JSONObject) bodyObj.get("Body");
}

在mysql中,我们也有使用符号($ .body.body []等)来做到这一点的方法。是否有任何一种表示法来获取对象

2 个答案:

答案 0 :(得分:1)

我认为我们对此写得很好。

Json object iteration

答案 1 :(得分:1)

如果您有一个表示数组中对象的类,则可以使用JSONArray类上的public <T> T fromJson​(JsonElement json, java.lang.Class<T> classOfT) throws JsonSyntaxExceptionGson反序列化为该类的数组:

class BodyItem {
    public String[] meta;
    public String[] links;
    public String field1;
    public String fieldn;
}

public BodyItem[] getBodyItems(final Gson gson, final JsonObject jsonObject) {
    final JsonElement body = jsonObject.get("body");
    return gson.fromJson(body, BodyItem[].class);
}

public static void main(final String[] args) {
    final String response = "<your REST API JSON response>";
    final Gson gson = new Gson();
    final JsonObject jsonObject = gson.fromJson(response, JsonObject.class);
    final BodyItem[] bodyItems = getBodyItems(gson, jsonObject);
}

如果您想使用一种更具符号性的方式来访问Gson对象中的字段,则可以使用JsonObject的便捷访问器:

  • JsonArray getAsJsonArray​(java.lang.String memberName)
  • JsonObject getAsJsonObject​(java.lang.String memberName)
  • JsonPrimitive getAsJsonPrimitive(java.lang.String memberName)

然后使用JsonArray,可以使用for (final JsonElement element : jsonArray).forEach进行迭代,并且可以使用JsonElement访问器获得JsonElement get(int i)

因此,假设您有原始的JsonObject响应,并想在body.field1列表的第二个元素中获取body的值,则可以执行以下操作:

String value = jsonObject
    .getAsJsonArray("body")
    .get(1)
    .getAsJsonObject()
    .getAsJsonObject("body")
    .getAsJsonObject("field1");