РЕДАКТИРОВАТЬ: Пока мои решения работают, лучший ответ Селиндека
Ваш Json недействителен согласно https://jsonlint.com/ по 2 причинам:
- Ваши имена полей не заключены в кавычки
- У вас есть запятая после последней строки
Я приму этот JSON с именами полей без кавычек:
{
name: "abcd",
addressLine1: "123",
addressLine2: "1111"
}
Я могу думать о 2 подходах:
1 - Обработка простой карты
// Create your mapper, and configure it to allow unquoted field names
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// Parse the JSON to a Map
TypeReference<HashMap<String, String>> typeRef
= new TypeReference<HashMap<String, String>>() {};
Map<String, String> jsonAsMap = null;
try {
jsonAsMap = mapper.readValue(yourJsonString, typeRef);
} catch (Exception e) {
System.out.println("Something went wrong:" + e.getMessage());
}
// Read the data from the map and build your objects
Student student = null;
if(jsonAsMap != null) {
Address address = new Address();
address.setLine1(jsonAsMap.get("addressLine1"));
address.setLine2(jsonAsMap.get("addressLine2"));
student = new Student();
student.setName(jsonAsMap.get("name"));
student.setAddress(address);
System.out.println(student.getName());
System.out.println(student.getAddress().getLine1());
System.out.println(student.getAddress().getLine2());
}
2 - Использование объекта Proxy (я бы предпочелвот этот)
Другой подход заключается в том, чтобы иметь прокси-класс, в котором вы можете десериализовать свой JSON и построить из него ученика:
class RawStudent {
private String name, addressLine1, addressLine2;
public Student toStudent() {
Address address = new Address();
address.setLine1(addressLine1);
address.setLine2(addressLine2);
Student student = new Student();
student.setName(name);
student.setAddress(address);
return student;
}
// GETTERS / SETTERS
}
И использовать его следующим образом:
// Create your mapper, and configure it to allow unquoted field names
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
// Parse the JSON to a RawStudent object
RawStudent rawStudent = null;
try {
rawStudent = mapper.readValue(jsonUnquoted, RawStudent.class);
} catch (Exception e) {
System.out.println("Something went wrong:" + e.getMessage());
}
// Read the data from the map and build your objects
Student student = null;
if (rawStudent != null) {
student = rawStudent.toStudent();
System.out.println(student.getName());
System.out.println(student.getAddress().getLine1());
System.out.println(student.getAddress().getLine2());
}
ПРИМЕЧАНИЕ
Если вы ошиблись и действительно указали поля в кавычках, например:
{
"name": "abcd",
"addressLine1": "123",
"addressLine2": "1111"
}
Тогда вам не нужна эта строка
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);