如何从来自api响应的json字符串构造对象列表?

Posted

技术标签:

【中文标题】如何从来自api响应的json字符串构造对象列表?【英文标题】:How construct list of objects from json string coming from api response? 【发布时间】:2018-04-25 07:14:59 【问题描述】:

之前可能会在这里问过类似的问题,但我没有运气,我想知道如何从下面的 json 字符串中提取特定对象,如 user,然后构造一个 ArrayList。不过有一个转折点,Users 下的属性之一是随机数,可以是任何东西!!!

这是我的 json 字符串的样子:

<code>
    "_links": 
    ,
    "count": 
    ,
    "users": 
        "123321":  //*Is a random number which can be any number
            "_links": 
            ,
            "user": 
                "id": "123321",
                "name": "...",
                "age": "...",
                "address": ""
                ..
            
        ,
        "456654": 
            "_links": 
            ,
            "user": 
                "id": "456654",
                "name": "...",
                "age": "...",
                "address": ""
                ...
            
        
        ...
    ,
    "page": 
    

</code>

我想把它转换成的java对象是:

@JsonIgnoreProperties(ignoreUnknown = true) // Ignore any properties not bound here
public class User 
    private String id;
    private String name;
    //setter:getter

注意:转换应该只考虑这两个字段 (id,name),并忽略来自 json 响应 user: 对象的其余字段。

理想情况下,我希望得到这样的列表:

List<User> users = resulted json transformation should return a list of users!!

您知道我该如何使用 Jackson JSON Parser/或者 GSON 来做到这一点吗?

【问题讨论】:

Ignoring new fields on JSON objects using Jackson的可能重复 不是真的因为我有一个随机的对象名称,可以是任何东西! 这个答案也没有显示如何构造List&lt;User&gt; 列表! 【参考方案1】:

jolttransformer 是你的朋友。使用 shift 和通配符 * 来捕获任意节点值,然后是标准映射器 (Jackson /gson) 。

【讨论】:

【参考方案2】:

由于用户键是随机的,您显然不能将它们映射到命名的 Java 字段。相反,您可以将***对象解析为地图,然后手动拉出用户对象。

public class UserWrapper 
    private User user;
    public User getUser()  return user; 


public class Root 
    private Map<String, UserWrapper> users;

    public List<User> getUsers() 
        List<User> usersList = new ArrayList();
        for (String key : map.keySet()) 
            UserWrapper wrapper = map.get(key);
            usersList.add(wrapper.getUser());
        

        return userList;
    


Root root = parseJson();
List<User> users = root.getUsers()

希望有帮助!

【讨论】:

以上是关于如何从来自api响应的json字符串构造对象列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 json 响应中连接来自不同对象数组的值? Node.js、Discord.js

如何使用来自 API 的 JSON 填充选择列表?

如何通过匹配来自两个 API 的 id 来查看来自两个 JSON API 的响应到单个回收器视图适配器中?

将 Json 响应中的对象列表映射到颤动中的列表

如何从动态列表中为 Vue 中的 API 响应创建列表渲染 JSON?

如何从来自 http.get 响应的对象中提取数据