Джексон Deserialization встроенного объекта Java
Мне нужно десериализовать следующий json, используя библиотеку Джексона в классе Customer
{
"code":"C001",
"city": "Pune",
"street": "ABC Road"
}
и классы как
class Address{
String city;
String street;
}
class Customer{
String code;
Address address;
}
Я нашел аналогичный вопрос в стеке
десериализация встраиваемых объектов Java jackson
но ответ не применим к моему делу. Также я хочу использовать библиотеку Джексона.
Как я могу сопоставить этот json с объектом Customer?
Ответы
Ответ 1
Вы можете поместить аннотацию @JsonUnwrapped в поле Address
в классе клиента. Вот пример:
public class JacksonValue {
final static String JSON = "{\n"
+" \"code\":\"C001\",\n"
+" \"city\": \"Pune\",\n"
+" \"street\": \"ABC Road\"\n"
+"}";
static class Address {
public String city;
public String street;
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
", street='" + street + '\'' +
'}';
}
}
static class Customer {
public String code;
@JsonUnwrapped
public Address address;
@Override
public String toString() {
return "Customer{" +
"code='" + code + '\'' +
", address=" + address +
'}';
}
}
public static void main(String[] args) throws IOException {
final ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(JSON, Customer.class));
}
}
Выход:
Customer{code='C001', address=Address{city='Pune', street='ABC Road'}}
Ответ 2
Вам нужен пользовательский десериализатор. Практические советы Джексона: пользовательские десериализаторы
В вашем случае использования может быть что-то вроде этого:
class CustomerDeserializer extends JsonDeserializer<Customer>
{
public Customer deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
JsonNode node = p.getCodec().readTree(p);
String code = node.get("code").asText();
String city = node.get("city").asText();
String street = node.get("street").asText();
Address adr = new Address(city, street);
return new Customer(code, adr);
}
}
Ответ 3
Ваш объект JSON для клиента должен выглядеть следующим образом:
{
"code":"C001",
"address":{
"city": "Pune",
"street": "ABC Road"
}
}
Ответ 4
Без какого-либо дополнительного преобразования эта json-структура не может быть сопоставлена с двумя классами. Либо напишите класс CustomerAddress
, который будет иметь все три поля из json, а затем создайте в нем Address getAddress()
и Customer getCustomer()
или преобразуйте json, чтобы вставить информацию о адресе внутри поля клиента, как это было предложено @eztam.
public CustomerAddress {
private String code;
private String city;
private String street;
public Address getAddress() {
return new Address(city, street);
}
public Address getCustomer() {
return new Customer(code, this.getAddress());
}
}
Ответ 5
Попробуйте это!!!
{
"code":"customer1",
"address":{
"type":"nested",
"properties":{
"city":"Hyderabad",
"street":"1000ftRoad"
}
}
}