【问题标题】:Convert JSON response into List<T>将 JSON 响应转换为 List<T>
【发布时间】:2017-05-06 01:42:15
【问题描述】:

我是 GSON 的新手。我需要将以下 JSON 响应转换为 List。

JSON 响应:

{
    "data": [{
        "data": {
            "ac_id": "000",
            "user_id": "000",
            "title": "AAA"
        }
    }, {
        "data": {
            "ac_id": "000",
            "user_id": "000",
            "title": "AAA"
        }
    }]
}

我有一个类来转换数据

帐户。爪哇

public class Account {

     public int ac_id;
     public int user_id;
     public String title;

    @Override
    public String toString(){
         return "Account{"+
         "ac_id="+ac_id+
         ", user_id="+user_id+
         ", title="+title+'}';

    }

}

当我用我的班级做出回应时,我得到:

[Account{ac_id="000", user_id="000", title="AAA"}, Account{ac_id="000", user_id="000", title="AAA"}]

现在我需要将这两个值放入List&lt;Account&gt;
你有什么建议?

【问题讨论】:

标签: java android json list gson


【解决方案1】:
JSONObject data = new JSONObject(response);
JSONArray accounts = data.getJSONArray("data");    
List<Account> accountList = new Gson().fromJson(accounts.toString(), new TypeToken<ArrayList<Account>>(){}.getType());

如果您无法更改 JSON 响应以删除内部“数据”键,则可以使用此:

Gson gson = new Gson();
ArrayList<Account> accountList = new ArrayList<Account>();
JSONArray accounts = data.getJSONArray("data");  
for (int i = 0; i < accounts.length(); i++) {
  JSONObject a = accounts.getJSONObject(i).getJSONObject("data");
  accountList.add(gson.fromJson(a.toString(), Account.class));
}

【讨论】:

  • 我不确定这是否适用于嵌套的 "data"
  • 我得到了 JsonSyntaxException 应为 BEGIN_ARRAY 但为 BEGIN_OBJECT
  • @user3478224 正如其他用户所提到的,这是因为您有一个嵌套的数据键。你应该有: { "ac_id": "000", "user_id": "000", "title": "AAA" } 而不是 { "data": { "ac_id": "000", "user_id": " 000", "title": "AAA" } }
  • @user3478224 如果您无法更改 JSON 响应,请查看编辑
  • 非常感谢@EliasN,您的回答很完美!
【解决方案2】:

为此,您可以使用 Tokens 以便 gson 可以理解自定义类型...

TypeToken<List<Account>> token = new TypeToken<List<Account>>(){};
List<Account > accountList= gson.fromJson(response, token.getType());

for(Account account : accountList) {
      //some code here for looping  }

【讨论】:

    【解决方案3】:

    嵌套的"data" 键是没有意义的。如果您可以修复您的 JSON,您应该改为这样做。

    {
        "data": [{
            "ac_id": "000",
            "user_id": "000",
            "title": "AAA"
        }, {
            "ac_id": "000",
            "user_id": "000",
            "title": "AAA"
        }]
    }
    

    然后这将起作用。

    JSONObject data = new JSONObject(response);
    JSONArray accounts = data.getJSONArray("data");
    List<Account> accountList = new Gson()
        .fromJson(accounts.toString(), new TypeToken<ArrayList<Account>>(){}.getType());
    

    或者,同样,第一个 "data" 也不是真正需要的。
    如果您可以让您的 JSON 成为帐户列表...

    [{
        "ac_id": "000",
        "user_id": "000",
        "title": "AAA"
    }, {
        "ac_id": "000",
        "user_id": "000",
        "title": "AAA"
    }]
    

    这会起作用

    List<Account> accountList = new Gson()
        .fromJson(response, new TypeToken<ArrayList<Account>>(){}.getType());
    

    【讨论】:

    • JsonSyntaxException 应为 BEGIN_ARRAY 但为 BEGIN_OBJECT
    • 就像我说的 - 由你来修复实际的 JSON。不要只是复制我提供的 Java 代码。
    • 或者你无法使用 Gson 并自己解析数据。
    • 感谢您的帮助,但我无法修改我的 JSON 字符串,它适用于我的所有课程,没有问题。当我尝试转换为对象数组时是崩溃的时候。
    • 如何解析数据?
    【解决方案4】:

    如果您可以访问创建 JSON 的位置,我认为您应该这样:

    {"data":[{"ac_id":"000","user_id":"000","title":"AAA"},{"ac_id":"000","user_id":"000","title":"AAA"}]}
    

    然后转换它,只需使用以下代码:(其中 jsonString 是上面的字符串)

    List<Account> accountList = new Gson().fromJson(jsonString, new TypeToken<ArrayList<Account>>(){}.getType());
    

    【讨论】:

    • JsonSyntaxException 应为 BEGIN_ARRAY 但为 BEGIN_OBJECT
    • 您是否先更改了 JSON?如果没有,那么您将收到该错误
    • stackoverflow.com/users/6709464/elias-n 答案很好,但对我来说,我认为它需要太多的代码行。我更喜欢简单的方式
    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2012-02-24
    • 2012-02-14
    • 1970-01-01
    相关资源
    最近更新 更多