将JSON响应转换为List<T>

5

我是一名新手,需要将以下JSON响应转换为列表。

JSON响应:

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

我有一个用于转换数据的类。
账户.java
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<Account>中。
您有什么建议吗?

https://github.com/google/gson/blob/master/UserGuide.md#TOC-Collections-Examples - OneCricketeer
认为你需要TypeToken。 - Azat Nugusbayev
https://dev59.com/p2Ml5IYBdhLWcg3wRlLo - Azat Nugusbayev
4个回答

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

如果您无法更改JSON响应以删除内部的"data"键,则可以使用以下方法:

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" 键配合使用。 - OneCricketeer
我遇到了 JsonSyntaxException 预期的 BEGIN_ARRAY 但实际上却是 BEGIN_OBJECT。 - user3478224
正如其他用户所提到的,这是因为您有一个嵌套的数据键。您应该使用以下格式: { "ac_id": "000", "user_id": "000", "title": "AAA" } 而不是 { "data": { "ac_id": "000", "user_id": "000", "title": "AAA" } } - Elias N
@user3478224,如果您无法更改JSON响应,请参见编辑。 - Elias N
非常感谢 @EliasN,你的答案完美地解决了问题! - user3478224

4
为此,您可以使用令牌,以便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  }

1
那个嵌套的"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());

就像我说的那样 - 修复实际的JSON取决于你。不要只是复制我给出的Java代码。 - OneCricketeer
或者你可以不使用Gson,自己解析数据。 - OneCricketeer
我很感激你的帮助,但我不能修改我的JSON字符串,因为它与我的所有类一起工作没有问题。当我尝试转换成对象数组时就会崩溃。 - user3478224
使用内置的 JSONObject 类并开始解析它。 https://dev59.com/02kw5IYBdhLWcg3w2-Ik 当然,您也可以在Gson中使用相同的方法,但需要使用另一个名称为JsonObject的类。 - OneCricketeer
这很冒险...如果你无法在服务器端编辑JSON,我认为'Elias N'有最新的答案可以解决问题。 - OneCricketeer
显示剩余4条评论

0
如果您可以访问创建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。 - user3478224
你改变了 JSON 吗?如果没有,那么你会得到那个错误。 - koceeng
http://stackoverflow.com/users/6709464/elias-n的回答很好,但对我来说,我认为它需要太多的代码行。我更喜欢简单的方法。 - koceeng

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