2016-06-09 1 views
0

Сериализация объекта следующей строки yeilds класса какДжексон сериализации и обертывание атрибутов в новый объект

public class User implements Serializable{ 

    private Integer id; 
    private String name; 
    private Integer pinCode; 
    private String city; 

    // getters /setters 
} 

{"id":1,"name":"XYZ","pinCode":123456,"city":"ABC"} 

Но мы хотим, чтобы атрибуты Pincode и город должен быть частью нового узла Json говорят адрес узла.

Так что мое ожидание результата:

{ 
    "id": 1, 
    "name": "XYZ", 
    "address": { 
    "pinCode": 123456, 
    "city": "ABC" 
    } 
} 

Может ли это быть достигнут без реорганизовать структуру классов и с помощью JSon примечаний

на точных противоположных линиях @JsonUnwrapped

ответ

-1

Добавить еще один класс под названием Address, как показано ниже:

public class Address implements Serializable { 

    private Integer pinCode; 
    private String city; 

    // getters /setters 
} 

Затем используйте Address класс внутри User класса, как показано ниже:

public class User implements Serializable { 

    private Integer id; 
    private String name; 
    private Address address; 
    // getters /setters 
} 

Теперь Джексон даст вам JSon строку типа:

{ 
    "id": 1, 
    "name": "XYZ", 
    "address": { 
    "pinCode": 123456, 
    "city": "ABC" 
    } 
} 

@JsonProperty ("address.pinCode") используется для установки имени поля в формате JSON , Пожалуйста, смотрите документ здесь более подробно JsonProperty

+0

@JsonUnwrapped - достигает прямо противоположный эффект. Ожидал чего-то на этом фронте. – hemantvsn

+0

@hemantvsn - yeah JsonUnwrapped добавляет внутренние поля класса в базовый класс json http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonUnwrapped. html – developerbhuwan

+0

Итак, моя потребность - это то, что делает противоположная работа @JsonUnwrapped: P – hemantvsn

1

вы можете использовать такой способ решения (но предпочтительно использовать JsonSerialize):

public class User implements Serializable{ 

    private Integer id; 
    private String name; 

    @JsonIgnore 
    private Integer pinCode; 

    @JsonIgnore 
    private String city; 

    @JsonProperty("address") 
    public Map<String, Object> getAddress() { 
     Map<String, Object> map = new HashMap<>(); 
     map.put("pinCode", pinCode); 
     map.put("city", city); 
     return map; 
    } 

    //Deserealization 
    public void setAddress(Map<String, Object> map) { 
     if(map!=null) { 
      city = (String) map.get("city"); 
      pinCode = (Integer) map.get("pinCode"); 
     } 
    } 

    // getters /setters 
} 

Благодаря @hemantvsn, например десериализации

+0

Получение желаемого: {"id": 1, "name": "XYZ", "address": {"pinCode": 411001, "city": "PUNE"}} – hemantvsn

+1

Это также должно работать для десериализации общественного недействительными setAddress (Map карта) { \t \t если (карта! = NULL) { \t \t \t город = (String) map.get ("город"); \t \t \t pinCode = (Integer) map.get ("pinCode"); \t \t} \t} – hemantvsn

Смежные вопросы