假设我有这个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
之类的事情。有什么想法吗?
答案 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结构,所以这可能是一个没有实际意义的点。