如何在一个变量中解析 list<String> 或 String

How to parse list<String> or String in one variable

我正在处理 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\": 1\n" +
    "            }\n" +
    "          },\n" +

"        \"constraints\": [\n" +
            "          {\n" +
            "            \"type\": \"NonNullRatio\",\n" +
            "            \"column\": \"ufi\",\n" +
            "            \"assertion\": {\n" +
            "              \"type\": \"LowerLimit\",\n" +
            "              \"threshold\": 1\n" +
            "            }\n" +
            "          },\n" +

您可以使用 this 选项配置 Jackson ObjectMapper 以接受单个值作为数组。

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

您需要告诉您的 Jackson 接受字符串作为数组。

您可以使用 -

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