将POJO序列化为json,其值为String或list

时间:2014-06-17 12:27:24

标签: java serialization jackson

假设我有这个POJO:

@JsonInclude(Include.NON_NULL)
public class Model {

    @JsonProperty(value="data")
    private String dataStr;
    private List<String> data;
}

它应序列化为

{ "data": "hello" }

{
    "data": [
        "hello",
        "world"
    ]
}

取决于某些条件。我怎么能和杰克逊一起做这个?

上面给出的课程不起作用。我到目前为止找到的唯一解决方案是

@JsonInclude(Include.NON_NULL)
public class Model {

    @JsonProperty
    private Object data;
}

但它并不是最好的。我认为有办法做@OneOf之类的事情。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

就像你发现的一样,你确实可以使用java.lang.Object类型。另一种类似的方法是使用JsonNode,如果你可以预先建立响应类型。

另一种方法是使用注释@JsonValue和容器类型;然后,您可以在单独的持有者类中隔离细节,如:

public class Model {
    public Wrapper data;
}

public class Wrapper {
    @JsonValue
    public Object methodToBuildValue() {
       // code to figure out what to return, String, List etc
    }
}

并且在这种情况下,任何methodToBuildValue()返回都是序列化而不是Wrapper值本身。 这提供了更多的灵活性和更多的打字;您可以使用Wrapper的不同访问者来使用自己的代码。

不确定最好的方法是什么,但我实际上只是建议使用这种松散类型的JSON结构可能不是一个好主意 - 它不容易映射到Java或C#这样的静态类型语言,我就是不确定有什么好处。我假设您没有定义要使用的JSON结构,所以这可能是一个没有实际意义的点。