【问题标题】:Deserialize String as List of Strings将字符串反序列化为字符串列表
【发布时间】:2021-01-08 19:09:02
【问题描述】:

我有一个包含以下属性的 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,因此我定义了一个自定义反序列化器:

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

我收到一个引用“inputBaz”属性的 IllegalArgumentException,我可以提供有关该属性的详细信息。有没有人看到我的反序列化器实现有任何明显的问题?谢谢

【问题讨论】:

  • 你试过摆脱那些构造函数了吗? public class MyD extends StdDeser...{public Set&lt;String&gt; deserialize(...) throws ... {...}}
  • 你可以试试StringDeserializer.instance.deserialize(jp, dc)

标签: java json jackson


【解决方案1】:

建议的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 实现自定义反序列化器,但仍会进行一些简单的转换。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您不需要实现自定义反序列化器,使用ACCEPT_SINGLE_VALUE_AS_ARRAY 功能。它也适用于集合:

      判断是否可以接受强制非数组的功能 (在 JSON 中)值与 Java 集合(数组, java.util.Collection) 类型。如果启用,集合反序列化器将 尝试处理非数组值,就好像它们有“隐式”环绕 JSON 数组。此功能旨在用于 兼容性/互操作性原因,使用包(例如 XML-to-JSON 转换器)在有的情况下会省略 JSON 数组 只是数组中的一个元素。默认情况下禁用该功能。

      另见:

      【讨论】:

        猜你喜欢
        • 2020-05-20
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        相关资源
        最近更新 更多