【问题标题】:Extract an array of objects from json string and put them in ArrayList?从json字符串中提取对象数组并将它们放入ArrayList?
【发布时间】:2018-04-25 13:46:55
【问题描述】:

我有一个简单的问题,想知道这里是否有人可以帮助我如何解析 Json 字符串并提取所有用户并将其放入列表中?

注意直接在Users下的object key是一个随机数,每次响应都会改变!

{
    "_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": {}
}

理想情况下,最好使用 Jackson Json 或 Gson。

另外,我只想用两个字段(id 和名称)构造 User 对象,而忽略其余字段!

【问题讨论】:

  • 创建一个映射 JSON 结构的类(至少是您感兴趣的),并使用 Jackson 来读取该类的实例。为 users 成员使用 Map
  • 如何忽略我不感兴趣的字段?您能否提供此类的示例以及如何使用 Jackson 在树上迭代并创建此 ArrayList!
  • 不让他们进入课堂。您需要自己开始尝试。从地图中提取值是阅读 Map 的 javadoc 的问题。

标签: java json jackson gson resttemplate


【解决方案1】:

Jackson 方法可能如下所示:

ObjectMapper om = new ObjectMapper();
JsonNode node = om.readTree(input);

List<JsonNode> users = node.findValues("user");

您可以从这里直接从JsonNode 实例中检索值,例如:

for (JsonNode jsonNode : users) {
    System.out.println(jsonNode.get("name"));
    System.out.println(jsonNode.get("id"));
}

或转换为 POJO:

for (JsonNode user : users) {
    User pojo = om.treeToValue(user, User.class);
    System.out.println(pojo.id);
    System.out.println(pojo.name);
}

假设存在如下所示的 POJO:

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    public String name, id;
}

【讨论】:

    【解决方案2】:

    你必须解析 json...这可以像 -

    JSONObject json=new JSONObject(response);
    JSONObject json2=json.getJSONObject("users");
    Iterator keys = json2.keys();
    
    while(keys.hasNext()) {
        String key = (String)keys.next();
        JSONObject json3=json2.getJSONObject(key);
        ArrayList<User> list=new ArrayList<>();
    
        JSONObject userjson=json3.getJSONObject("user");    
        User user = new User();
        String id=userjson.getString("id");
        String name=userjson.getString("name");
        user.setId(id);
        user.setName(name);
        list.add(user);      
    }
    

    希望对您有所帮助.. :)

    【讨论】:

    • 不,解决方案没有考虑随机数。据我所知,这是执行 json 解析的最标准方法。对于 100 个用户来说,它不需要时间。我已经在许多拥有 5000 名用户的标准应用中实现了这一点。
    • 现在检查代码..它很可能会工作。我也通过忽略它们来解析随机数。该列表将仅包含用户对象,即您想要的用户列表..还有什么可以更有效地做到这一点,因为我们必须将每个用户对象保存在列表中..所以我们会以某种方式这样做仅在循环中..它不会花费时间..使用流类将做同样的事情,复杂性将是相同的。
    • mvnrepository.com/artifact/org.json/json 如果可行,请标记为正确.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多