当前位置: 首页 > 知识库问答 >
问题:

Jackson将“”反序列化为空列表

容学林
2023-03-14

我有一个JSON字符串,它将空列表标记为"而不是[]。因此,例如,如果我有一个没有子对象的对象,我将收到这样的字符串:

{"id":13, "children":""}

我想将其反序列化为父类,将子类正确设置为子类的空列表。

public class Parent {

    private Long id;
    private List<Child> children;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public List<Child> getChildren() {
        return children;
    }

    public void setChildren(List<Child> children) {
        this.children = children;
    }
}

对于上面的JSON字符串,我想要一个将其id设置为13的对象,并将子元素设置为新的ArrayList

Parent
    id <- 13
    children <- new ArrayList<Child>()

我知道如何为整个类使用注释

@JsonDeserialize(using = ParentDeserializer.class)
public class Parent { 
    ...
}

然后呢

public class ParentDeserializer extends JsonDeserializer<Parent> {
    public Parent deserialize(JsonParser parser, DeserializationContext context) {
        ...    
    }
}

但是,我想解决从"字符串正确实例化列表的一般问题:

public class Parent {
    ...
    // Can I get something like this?
    @JsonDeserialize(using = EmptyArrayDeserializer<Child>.class) 
    public void setChildren(List<Child> children) {
        this.children = children;
    }
}

我能得到这样的东西吗?

共有1个答案

郜光明
2023-03-14

两种选择;首先,要启用“ACCEPT\u EMPTY\u STRING\u AS\u NULL\u OBJECT”:

mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

因此,空字符串变为null。如果要将其转换为实际的空列表,请重写setter:

public void setChildren(List<Child> c) {
    if (c == null) {
       children = Collections.emptyList();
    } else {
       chidlren = c;
    }
}
 类似资料:
  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 问题内容: 我有以下类,它是由Jackson映射的(简化版): 在某些情况下,服务器会返回,然后我想将name设置为空的Java String。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串? 问题答案: 您可以在默认构造函数中或声明时进行设置: 要么

  • 我有以下由Jackson映射的类(简化版): 在某些情况下,服务器返回,然后我想将name设置为空Java字符串。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串吗?

  • 我有一个带有lombok注释的POJO,我的JSON通过Jackson将它反序列化,如下所示: 当jackson试图反序列化仅列出一个响应时 缺少什么来确保所有属性要么包含反序列化JSON中的相应值,要么包含默认分配值的空列表? -更新-这不是问题,直到我从Spring 1.3.5升级到1.4.2,这也将我的Jackson版本从2.6.6升级到2.8.4

  • 我被要求更改jackson映射配置,以便我们(从JSON)反序列化的每个空对象都将被反序列化为NULL。 因此,对于像或这样的json,我希望在java中转换为(而不是空字符串或实例)。

  • 问题内容: 考虑以下枚举和类: 并考虑以下主要功能: 当前,该主输出为: 这种输出并不适合我,因为除了字符串的,我想它是,这是序号值在枚举。 所以我想要得到的实际结果是: 有一些优雅的方法可以使其表现为这种方式吗? 问题答案: 它应该通过指定映射器来工作。 如注解的Javadoc所述,这也适用于反序列化: 注意:当用于Java枚举时,一个附加功能是带注释的方法返回的值也被视为要反序列化的值,而不仅