【问题标题】:Jackson: vary JSON property value by viewJackson:按视图改变 JSON 属性值
【发布时间】:2015-07-03 10:31:01
【问题描述】:

使用 Jackson,我知道我可以使用 @JsonView 在视图的序列化中包含/排除属性。

如何通过视图改变 JSON 属性的值?

例如,我可能希望视图 A 中的属性值是整个对象,在视图 B 中是过滤掉某些属性的对象,在视图 C 中,我只希望它是“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"
}

【问题讨论】:

  • +1,这是个好问题。在您的示例中,我通常生成{"prop":{"id":123}} 以查看C{"prop":{"name":"abc"}} 以查看D。我也想知道当只有一个值时如何删除属性名称;)
  • 使用标准@JsonView可以实现A和B,但不能使用C和D。看看这个问题:github.com/FasterXML/jackson-databind/issues/440

标签: java json jackson


【解决方案1】:

您可能可以使用泛型来实现这一点,但您还需要提前知道要使用什么具体类,例如:

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;
    }
}

所以不确定这是不是你想要的。

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 2018-12-28
    • 2013-03-24
    • 2022-09-29
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多