【问题标题】:Parse a non-top level Json array with Gson TypeToken使用 Gson TypeToken 解析非顶级 Json 数组
【发布时间】:2015-09-07 14:01:44
【问题描述】:

我得到这样的 Json 数据:

{
  "crowds": [
    {
      "_id": "55ed5f87cdc20e5b2d7ba546",
      "name": "The 1 crowd"
    },
    {
      "_id": "55ed6d1a6cc793110057587d",
      "name": "testCrowd"
    },
    {
      "_id": "55ed74e2d960a18c3adb3cd7",
      "name": "The crowd"
    }
  ]
}

对应Crowd类:

public class Crowd {
    private String _id;
    private String name;
}

我想使用 Gson 将 Json 数据转换为 Crowd 对象列表。下面的方法来源于官方的Gson例子:

private static Type listCrowdType = new TypeToken<List<Crowd>>(){}.getType();    
public void handleJsonResponse(String jsonString) {
        JsonParser jsonParser = new JsonParser();
        JsonArray array = jsonParser.parse(jsonString).getAsJsonArray();
        List<Crowd> crowds = gson.fromJson(array.get(0), listCrowdType);
    }

在这种情况下,Gson 告诉我This is not a JSON Array. 我什至无法计算我尝试转换 jsonString 并将其传递给 Gson 的所有不同方式,但它永远不会快乐,给了我不同的错误,如 Expected BEGIN_OBJECT but was BEGIN_STRING 等。 怎么办?

我尝试过的其他东西:

public void handleJsonResponse(String jsonString) {
    JsonParser jsonParser = new JsonParser();
    JsonElement jsonElement = jsonParser.parse(jsonString);
    JsonObject jsonObject = jsonElement.getAsJsonObject();

    List<Crowd> crowds = gson.fromJson(jsonObject.get("crowds"), listCrowdType);
}

错误:Expected BEGIN_OBJECT but was STRING

【问题讨论】:

  • 尝试删除 JSON 列表中的最后一个逗号。您当前有 }, ],它可能无法解析。
  • 这是我复制 JSON 并删除一些元素以使其更易于阅读的错误。实际传递的 JSON 不包含它。
  • 您的最后一次尝试应该可以正常工作。这是您正在解析的唯一 JSON 吗?错误是否可能来自不同的尝试?

标签: json parsing gson


【解决方案1】:

你可以试试我下面的代码:

Gson gson = new Gson();
try {
    JSONObject jsonObject = new JSONObject(jsonString);
    if (!jsonObject.isNull("crowds")) {                    
        JSONArray jsonArray = jsonObject.getJSONArray("crowds");
        Crowd[] crowdList = gson.fromJson(jsonArray.toString(), Crowd[].class);
        List<Crowd> crowds = new ArrayList<>(Arrays.asList(crowdList));    
    }        
} catch (JSONException e) {
    e.printStackTrace();
}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多