2015-04-24 2 views
4

Использование Jackson, я знаю, что я могу включить/исключить свойство из сериализации для просмотра с помощью @JsonView.Jackson: изменить значение свойства JSON по виду

Как я могу изменить значение свойства JSON по виду?

например, я мог бы хотеть, чтобы значение свойства во взгляде А являлось целым объектом, в виду, что B является объектом с определенными свойствами, отфильтрованными, в представлении С, я просто хочу, чтобы это был «id» (нет не объект), а вид D, я мог бы хотеть, чтобы это было «имя» (нет объекта):

// view A JSON 
{ 
    "prop": {"id": 123, "name": "abc", "description": "def"} 
} 

// view B JSON 
{ 
    "prop": {"id": 123, "name": "abc"} 
} 

// view C JSON 
{ 
    "prop": 123 
} 

// view D JSON 
{ 
    "prop": "abc" 
} 
+0

+1, это хороший вопрос. В вашем примере я обычно генерирую '{" prop ": {" id ": 123}}' для просмотра 'C' и' {"prop": {"name": "abc"}} 'для просмотра' ​​D'. Я также хочу знать, как удалить имя свойства, когда есть только один со значением;) –

+0

Вы можете достичь A и B, используя стандартный '@ JsonView', но не C и D. Посмотрите на эту проблему: https://github.com/FasterXML/jackson-databind/issues/440 –

ответ

0

вы, вероятно, может достичь этого с помощью дженериков, но вы также должны знать заранее, какой конкретный класс использовать , например:

public static void main(String[] args) throws Exception { 
    final ObjectMapper mapper = new ObjectMapper(); 
    final MyStuff<Prop> myStuff = mapper.readValue("{\"prop\": {\"id\": 123, \"name\": \"abc\", \"description\": \"def\"}}", MyStuff.class); 
    final MyStuff<String> myStuff1 = mapper.readValue("{\"prop\": \"abc\"}", MyStuff.class); 
    final MyStuff<Integer> myStuff2 = mapper.readValue("{\"prop\": 123}", MyStuff.class); 
} 


@JsonIgnoreProperties(ignoreUnknown = true) 
public static class Prop { 
    private Integer id; 
    private String name; 
    private String description; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 
} 

@JsonIgnoreProperties(ignoreUnknown = true) 
public static class MyStuff<T> { 

    private T prop; 

    public T getProp() { 
     return prop; 
    } 

    public void setProp(T prop) { 
     this.prop = prop; 
    } 
} 

так что не уверен, что это то, что вы хотите.