java - Jackson ObjectMapper DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT

标签 java json jackson json-deserialization

我在 Jersey 应用程序中使用 Jackson 进行 JSON 序列化/反序列化。我想将 JSON 中的空字符串读取为我的 java POJO 属性中的空值。我试图在 Object Mapper 上设置 DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 但它不起作用。这是下面的代码

import java.io.IOException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class TestMapper {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestMapper.testJson();

    }

    public static void testJson(){
        String jsonString = "{\"name\":\"First Name\",\"phone\":\"\",\"unknown\":\"test\"}";
        ObjectMapper result = new ObjectMapper();
        //result.setDeserializationConfig(result.getDeserializationConfig().with(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT));
        //result.enable(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        /*DeserializationConfig deserializeConfig = result.getDeserializationConfig();
        deserializeConfig.with(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);*/
        result.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
        result.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    try {
            TestBean testBean = result.readValue(jsonString, TestBean.class);
            if(testBean.getPhone()!=null&& testBean.getPhone().equals("")){
                System.out.print("Phone Number is empty string");
            }else{
                System.out.print("Phone Number is null");
            }
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

bean 如下

public class TestBean {

    private String name;
    private String phone;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public TestBean(String name, String phone) {
        super();
        this.name = name;
        this.phone = phone;
    }
    public TestBean() {
        super();
    }


}

输出总是

Phone Number is empty string

我不确定为什么这不起作用。我正在使用 jackson 1.9.2。

最佳答案

注意 ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 的 javadoc

Feature that can be enabled to allow JSON empty String value ("") to be bound to POJOs as null.

因此,一个空的 String 可用于将 null 映射到 POJO。 String 不是 POJO,它被认为是 JSON 原始值。

你不能在这里使用它。

ACCEPT_EMPTY_STRING_AS_NULL_OBJECT 适用于类似的东西

{"name":"First Name","phone":"","unknown":"test"}

你会在哪里制作一些 POJO 类型的 TestBean.phone 字段

class Phone {
    private String number;
}

然后反序列化将使 phone 字段为 null

关于java - Jackson ObjectMapper DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22688713/

相关文章:

java - 如何从数据库读取 keystore

java - 使用 Jackson 将 xml 映射到 java 时出错 : com. fastxml.jackson.databind.exc.MismatchedInputException

java - Spring @RequestBody继承

java - 使用 Jackson : Can we have optional variables in a POJO 解析 JSON

javascript - 语法错误: unterminated string literal with JSON array

ruby-on-rails - json请求在rails中返回html

java - 用于标量查询的 Hibernate 缓存

java - 抽象或带注释的类而不是接口(interface)作为 MXBean

java - 将 Java 代码转换为 Kotlin 代码时出错

javascript - 如何使用window.fetch加载本地json数据(ES6)