【问题标题】:how to parse a json similar string and map it into a pojo如何解析 json 相似的字符串并将其映射到 pojo
【发布时间】:2020-01-16 06:08:09
【问题描述】:

我正在尝试使用 Jackson 将以下 JSON 映射到我的 POJO。我有以下 JSON 和以下 POJO。请让我知道如何将 JSON 映射到 POJO。 JSON 字符串:

{
  "Application": {
    "id": "0",
    "name": "MyApp",
    "users": [
      {
        "User": {
          "id": "2",
          "name": "Beth Jones"
        }
      }
    ],
    "groups": [
      {
        "Group": {
          "id": "1",
          "name": "SimpleGroup",
          "users": [
            {
              "User": {
                "id": "2",
                "name": "Beth Jones"
              }
            }
          ]
        }
      }
    ]
  }
}

根据客户端规范的POJO如下:

package com.example.custom;

//import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.example.Application;
import com.example.Group;
import com.example.User;

import java.util.Collection;

//@JsonIgnoreProperties(ignoreUnknown = true)
public class MyApplication extends Application {

    private Collection<User> users;

    private Collection<Group> groups;

    public MyApplication(String id, String name) {

        super(id, name);
    }

    public void setUsers(Collection<User> users) {
        this.users = users;
    }

    public void setGroups(Collection<Group> groups) {

        this.groups = groups;
    }

    @Override
    public Collection<User> getUsers() {

        return this.users;
    }

    @Override
    public User getUser(String userId) {

        for (User user: MyParser.myApp.getUsers()) {
            if (user.getId().equals(userId))
                return user;
        }
        return null;
    }

    @Override
    public Collection<Group> getGroups() {

        return this.groups;
    }

    @Override
    public Group getGroup(String groupId) {

        for (Group group: MyParser.myApp.getGroups()) {
            if (group.getId().equals(groupId))
                return group;
        }
        return null;
    }

    @Override
    public String toString() {
        return "MyApplication{" +
                "users=" + users +
                ", groups=" + groups +
                '}';
    }
}

映射逻辑:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MyParser.myApp = mapper.readValue(rewriter.getText(),MyApplication.class);

生成的对象无法捕获任何内容,因为它全部为空。请帮忙。提前致谢。

【问题讨论】:

    标签: json parsing mapping pojo jackson-databind


    【解决方案1】:

    我认为你应该正确地建模你的 JSON,在users 列表中你不应该再次指定键是 User,应该假设用户列表将只包含用户,groups 列表也是如此。

    恕我直言,JSON 应该是这样的:

    {
      "application": {
        "id": "0",
        "name": "MyApp",
        "users": [ . ==> Since this is a user List, it will definitely contains user.
          {
            "id": "2",
            "name": "Beth Jones"
          }
        ],
        "groups": [
          {
            "id": "1",
            "name": "SimpleGroup",
            "users": [
              {
                "id": "2",
                "name": "Beth Jones"
              }
            ]
          }
        ]
      }
    }
    

    现在 POJO 也需要一些修改,我只是添加了最低限度的 POJO。

    class Application {  <====== Top Level Class
        private Long id;
        private String name;
        private List<User> users;  // Application has some Users
        private List<Group> groups; // Application has some groups
    }
    
    class User {   
        private Long id;
        private String name;
    }
    
    class Group {
        private Long id;
        private String name;
        private List<User> users;  // Each group has some associated users.
    }
    

    现在您可以使用 Java 的任何标准 JSON 库并将您的 JSON 转换为 POJO。这将简化您的结构,并且您不会遇到这种结构的空问题。

    【讨论】:

    • 谢谢@Neeraj,我会试一试的。让我也知道如何在不使用任何库的情况下解析类似 JSON 的结构。
    • 为什么你不想使用任何库,它们被暴露为库是有目的的,没有必要重新发明经过社区测试多年的轮子。
    • ...我实际上想了解实现它的不同方法。大多数时候,作业的编码分配不允许使用现有的库。虽然我可以看一下这些库的源代码,但如果可能的话,请您提供任何指针/方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多