假设我们有以下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)那样的整个实体:)
答案 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。