我正在研究JSON序列化,我有一个场景,在JSON中的字段可以是字符串/字符串列表。我不确定如何序列化这样的对象。
@Data
public class NonNullRatio extends Constraint {
@NonNull private List<String> column;
@NonNull private Assertion assertion;
}
输入JSON可以是-
" "constraints": [n" +
" {n" +
" "type": "NonNullRatio",n" +
" "column": ["transaction_status", "user_charge_id", "psp_transaction_id"],n" +
" "assertion": {n" +
" "type": "LowerLimit",n" +
" "threshold": 1n" +
" }n" +
" },n" +
或
" "constraints": [n" +
" {n" +
" "type": "NonNullRatio",n" +
" "column": "ufi",n" +
" "assertion": {n" +
" "type": "LowerLimit",n" +
" "threshold": 1n" +
" }n" +
" },n" +
你需要告诉你的Jackson接受String作为Array。
你可以使用-
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
你的POJO应该看起来像-
@Data
public class NonNullRatio extends Constraint {
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
@NonNull private List<String> column;
@NonNull private Assertion assertion;
}
您可以使用此选项配置JacksonObjectMapper
以接受单个值作为数组。
new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
,
class SomeClass{
private List<String> values;
// getter setters
@Override
public String toString() {
return "SomeClass{" +
"values=" + values +
'}';
}
}
public class TestJSON {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper()
.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
String jsonString = "{"values":"A"}";
System.out.println(objectMapper.readValue(jsonString, SomeClass.class));
jsonString = "{"values":["A","B"]}";
System.out.println(objectMapper.readValue(jsonString, SomeClass.class));
}
}
输出SomeClass{values=[A]}
SomeClass{values=[A, B]}