将字符串反序列化为字符串列表

时间:2020-09-22 15:57:38

标签: java json jackson

我有一个包含以下属性的POJO

public class Example {
  @JsonProperty("inputFoo")
  private String foo
  @JsonProperty("inputBar")
  private String bar
  @JsonProperty("inputBaz")
  @JsonDeserialize(using = MyDeserializer.class)
  private Set<String> baz
}

我正在用来表示此数据的JSON当前将baz属性表示为单个字符串:

{"inputFoo":"a", "inputBar":"b", "inputBaz":"c"}

我正在使用Jackson ObjectMapper尝试将JSON转换为我的POJO。我知道从JSON输入的baz字符串不会干净地映射到我要表示为它的Set,因此我定义了一个自定义Deserializer:

public class MyDeserializer extends StdDeserializer<Set<String>> {
   public MyDeserializer(){}

   public MyDeserializer(Class<?> vc) {
      super(vc);
   }

   public Set<String> deserialize(JsonParser p, DeserializationContext cxt) throws IOException, JsonProcessingException {
      String input = p.readValueAs(String.class);
      Set<String> output = new HashSet<>();
      if(input != null) {
         output.add(input);
      }
      return output;
   }
}

我得到一个IllegalArgumentException引用“ inputBaz”属性,我可以提供有关的详细信息。有人看到我的解串器实现有任何明显的问题吗?谢谢

3 个答案:

答案 0 :(得分:2)

您无需实施自定义反序列化程序,请使用ACCEPT_SINGLE_VALUE_AS_ARRAY功能。它也适用于集合:

确定强制非数组是否可接受的功能 (在JSON中)值可与 Java集合(数组, java.util.Collection)类型。如果启用,则集合反序列化器将 尝试处理非数组值,就好像它们具有“隐式”周围 JSON数组。此功能旨在用于 兼容性/互操作性原因,以便与软件包一起使用(例如 XML到JSON转换器),如果有 只是数组中的单个元素。默认情况下,该功能处于禁用状态。

另请参阅:

答案 1 :(得分:0)

使用此无参数构造函数替换2个构造函数:

public MyDeserializer() {
    super(TypeFactory.defaultInstance().constructCollectionType(Set.class, String.class));
}

答案 2 :(得分:0)

ACCEPT_SINGLE_VALUE_AS_ARRAY是一个不错的选择。

也许您的实际问题更加复杂,但是如果没有,您也可以尝试使用@JsonCreator而不是自定义反序列化器。喜欢:

public class Example {

    @JsonCreator
    public Example(@JsonProperty("inputFoo") String foo,
            @JsonProperty("inputBar") String bar,
            @JsonProperty("inputBaz") String strBaz) {
        this.foo = foo;
        this.bar = bar;
        this.baz = new HashSet<>();
        baz.add(strBaz);
    }

    private String foo;
    private String bar;
    private Set<String> baz;
}

仅为说明,在更一般的情况下,您可能也避免使用@JsonCreator实现自定义反序列化器,但仍然进行一些简单的转换。