使用Gson循环遍历Json数组

27

我正在尝试解析一个jsonObject,但似乎无法成功,以下是我的代码:

 json = (json data)
 JsonParser parser = new JsonParser();
 JsonObject rootObj = parser.parse(json).getAsJsonObject();
 JsonObject paymentsObject = rootObj.getAsJsonObject("payments");

 for(JsonObject pa : paymentsObject){
        String dateEntered = pa.getAsJsonObject().get("date_entered").toString();
    }

但是我得到了一个“foreach 不适用于此类型”的错误,我错过了什么。我尝试了不同的方法,但似乎无法解决它。谢谢

Json

 {
 "Name":"Test 2",
 "amountCollected":"1997",
 "payments":[
  {
     "quoteid":"96a064b9-3437-d536-fe12-56a9caf5d881",
     "date_entered":"2016-05-06 08:33:48",
     "amount":"1962",         
  },
  {
     "quoteid":"96a064b9-3437-d536-fe12-56a9caf5d881",
     "date_entered":"2016-05-06 08:33:08",
     "amount":"15",         
  },
  {
     "quoteid":"96a064b9-3437-d536-fe12-56a9caf5d881",
     "date_entered":"2016-05-06 03:19:08",
     "amount":"20",         
  }
 ]
}

2
JsonObject 不是 Iterable,所以你不能像那样在增强的 for 循环中使用它。也许如果你分享一下你正在尝试解析的 Json 数据的示例,我们可以更好地帮助你。不过有一个想法:你确定 payments 的值是一个对象而不是一个数组吗?也许你应该调用 rootObj.getAsJsonArray("payments")。返回的 JsonArray 是可迭代的。 - Andreas
我尝试过了,但是出现了“com.google.gson.JsonObject无法转换为com.google.gson.JsonArray”的错误。 - user1054513
更新了问题,谢谢。 - user1054513
看起来你忘记对这个 PHP 类进行 json_encode 了。 - OneCricketeer
这只是使用原始JSON更新的PHP输出。 - user1054513
由于您正在使用Gson,因此不需要手动解析JSON。您可能希望使用此网站创建一些Java对象,以供Gson使用。http://www.jsonschema2pojo.org/ - OneCricketeer
1个回答

65

现在我们可以看到数据,发现payments实际上是一个数组(values使用[])。

这意味着您需要调用rootObj.getAsJsonArray("payments"),它将返回一个JsonArray,并且是一个Iterable<JsonElement>,这意味着您的循环应该是for(JsonElement pa : paymentsObject)

请记住,数组的每个值都可以是任何类型的Json元素(对象、数组、字符串、数字等)。

由于您知道它们都是JsonObject,因此可以在它们上面调用getAsJsonObject()

json = (json data)
JsonParser parser = new JsonParser();
JsonObject rootObj = parser.parse(json).getAsJsonObject();
JsonArray paymentsArray = rootObj.getAsJsonArray("payments");
for (JsonElement pa : paymentsArray) {
    JsonObject paymentObj = pa.getAsJsonObject();
    String     quoteid     = paymentObj.get("quoteid").getAsString();
    String     dateEntered = paymentObj.get("date_entered").getAsString();
    BigDecimal amount      = paymentObj.get("amount").getAsBigDecimal();
}

你是正确的,我刚刚注意到有时我的付款是一个对象而不是一个数组,这导致了错误。非常感谢大家的帮助。 - user1054513

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接