Java 将POJO序列化为json,使用一些值作为字符串或列表

Java 将POJO序列化为json,使用一些值作为字符串或列表,java,serialization,jackson,Java,Serialization,Jackson,假设我有这个POJO: @JsonInclude(Include.NON_NULL) public class Model { @JsonProperty(value="data") private String dataStr; private List<String> data; } 或 取决于某些条件。我怎么能和Jackson这样做 上面的课不起作用。到目前为止,我找到的唯一解决办法是 @JsonInclude(Include.NON_NULL) p

假设我有这个POJO:

@JsonInclude(Include.NON_NULL)
public class Model {

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

取决于某些条件。我怎么能和Jackson这样做

上面的课不起作用。到目前为止,我找到的唯一解决办法是

@JsonInclude(Include.NON_NULL)
public class Model {

    @JsonProperty
    private Object data;
}

但这不是最好的。我认为有一种方法可以做类似于的事情。有什么想法吗?

正如您所发现的,您确实可以使用type
java.lang.Object
。另一种类似的方法是使用
JsonNode
,前提是您可以预构建响应类型

另一种方法是使用注解
@JsonValue
和容器类型;然后,您可以在单独的holder类中隔离详细信息,如:

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
值本身。 这给了更多的灵活性和更多的打字;对于
包装器
,您可以有不同的访问器供自己的代码使用


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

第一个示例有两个名为“data”的字段,它们也有不同的类型。但是它不起作用。我使用的是Spring,任何返回该对象的尝试都会返回406HTTP状态码。这就是@Stefoan所做的。如果使用相同的名称定义多个字段,您将遇到困难。我不认为杰克逊能为你解决这个问题。如果可能的话,我建议删除
@JsonProperty
或将list元素重命名为
dataList
,以避免混淆。当然,这是可以做到的。但这与许多REST服务中的情况相同。您可以在此处看到其中一个示例:
@JsonInclude(Include.NON_NULL)
public class Model {

    @JsonProperty
    private Object data;
}
public class Model {
    public Wrapper data;
}

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