我的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 []等)来做到这一点的方法。是否有任何一种表示法来获取对象
答案 0 :(得分:1)
我认为我们对此写得很好。
答案 1 :(得分:1)
如果您有一个表示数组中对象的类,则可以使用JSONArray
类上的public <T> T fromJson(JsonElement json, java.lang.Class<T> classOfT) throws JsonSyntaxException
将Gson
反序列化为该类的数组:
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");