使用ID引用

时间:2018-05-30 07:06:55

标签: java json

假设我们有以下JSON示例:

{
  "teachers": [{
    "id": "abc",
    "payment": 10,
    "name": "xyz",
    "clases": ["1", "3"]
  }, {
    "id": "qwe",
    "payment": 12,
    "name": "xcv",
    "classes": ["1", "2"]
  }],
  "classes": [{
    "id": "1",
    "room": 7
  }, {
    "id": "2",
    "room": 1
  }, {
    "id": "3",
    "room": 2
  }]
}

我想将它反序列化为Java对象(getter / setters ommited):

class Teacher {
    private String id;
    private double payment;
    private String name;
    private List<CLassRoom> classRooms;
}

class ClassRoom {
    private String id;
    private int room;
}

如您所见,我们在这里有一个参考。我知道我可以使用Jackson(并希望)反序列化它,但问题是我无法触及DTO本身(因此注释是不可能的,也希望避免包装器(许多类))。另外,如果反序列化的“配置”在单独的文件中(例如json schema),那将是很好的。我还想避免用户给出的一些标签 - 他应该只传递我的值。而且,如果他犯了一些错误,他应该知道错误在哪里。 此外,如果我可以操纵json中的字段名称会很好(某些客户可能有不同的习惯)。

我没有找到满足上述所有要求的任何内容(实体引用和错误处理是最重要的)。但是 - 我刚刚听说过json架构,所以也许它提供了这样的功能(但我找不到它)。任何有用的参考/ example / lib?我将不胜感激。

只是为了正确 - 假设给定的json是实例的 RELATIONAL 数据库快照。我只想创建像hibernate(或实际上是JPA)那样的整个实体:)

2 个答案:

答案 0 :(得分:0)

1. add jar of import org.json.JSONObject.

2. JSONObject object = new JSONObject(list)
    2.1 object.has("teachers") if it is exists
    2.2 JSONArray teacherArray = (JSONArray) object.get("teachers");
    2.3 JSONObject teacherJsonObject = teacherArray .getJSONObject(0);
    (if you have more than jsonobject in json arrary then itrate it.)
    2.4 if(teacherJsonObject .has("id"))//you can check existence like this.
        String id=teacherJsonObject .getString("id");
        String payment=teacherJsonObject .getString("payment");
        String name=teacherJsonObject .getString("name");

答案 1 :(得分:0)

这可能不是最好的解决方案,但它是一个有效的解决方案。

让我们创建一个Parser类,如下所示:

public class Parser {
    private List<Teacher> teachers;
    private List<ClassRoom> classes;

    public void parse() {
        for (Teacher teacher : teachers) {
            for (String classRoomId : teacher.getClasses()) {
                for (ClassRoom classRoom : classes) {
                    if (classRoom.getId().equals(classRoomId)) {
                        teacher.getClassRooms().add(classRoom);
                    }
                }
            }
        }
    }
}

修改您的ClassRoom类,使其在id字段上具有getter:

public class ClassRoom {
    private String id;
    private int room;

    public String getId() {
        return id;
    }
}

你的老师课要获得课程的ID和classRooms参考:

public class Teacher {
    private String id;
    private double payment;
    private String name;
    private String[] classes;
    private List<ClassRoom> classRooms = new ArrayList<>();

    public String[] getClasses() {
        return classes;
    }

    public List<ClassRoom> getClassRooms() {
        return classRooms;
    }
}

如果您使用Gson库,则可以像这样解析您的JSON:

Gson gson = new Gson();
Parser parser = gson.fromJson(jsonString, Parser.class);
parser.parse;

现在,每位教师都会正确引用他们的classRooms。