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

Jackson ObjectMapper DeseriazationConfig.特征。ACCEPT_EMPTY_STRING_AS_NULL_OBJECT

林修真
2023-03-14

我正在Jersey应用程序中使用Jackson进行JSON序列化/反序列化。我想将JSON中的空字符串读取为java POJO属性中的null值。我试图设置反序列化配置。特色接受对象映射器上的\u空\u字符串\u作为\u空\u对象,但它不工作。下面是代码

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

}

豆子如下

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.

共有1个答案

孙翰墨
2023-03-14

注意ACCEPT\u EMPTY\u STRING\u AS\u NULL\u OBJECT的javadoc

允许将JSON空字符串值(“”)作为null绑定到POJO的功能。

因此,可以使用空的Stringnull映射到POJO。一个String不是一个POJO,它被认为是一个JSON基元值。

你不能在这里用这个。

接受\u空\u字符串\u作为\u空\u对象

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

您将在其中创建TestBean。phone某些POJO类型的字段,如

class Phone {
    private String number;
}

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

 类似资料:
  • 将跟踪和跨度添加到Slf4J MDC,以便您可以从日志聚合器中的给定跟踪或跨度中提取所有日志。示例日志: 2016-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:30:58.372 ERROR [bar,6bfd

  • 反缓存 anticache设置该选项后,它将删除可能引起服务器响应的Header(if-none-match和if-modified-since)304 not modified。当您要确保完全捕获HTTP交换时,这很有用。当您要确保服务器以完整的数据响应时,也经常在客户端重播期间使用它。 客户端重播 客户端重播可以做到:您提供了一个以前保存的HTTP对话,而mitmproxy则一个接一个地重播了

  •   特征缩放是用来统一资料中的自变项或特征范围的方法,在资料处理中,通常会被使用在资料前处理这个步骤。 1 动机   因为在原始的资料中,各变数的范围大不相同。对于某些机器学习的算法,若没有做过标准化,目标函数会无法适当的运作。举例来说,多数的分类器利用两点间的距离计算两点的差异, 若其中一个特征具有非常广的范围,那两点间的差异就会被该特征左右,因此,所有的特征都该被标准化,这样才能大略的使各特征

  • 我当前的Cucumber文件如下所示: 所以现在我想再添加几个场景,可能是在同一个文件中进行API测试。所以我想为此创建一个新特性,而不是使用Feature:Test Online application页面。这样我就不需要为API测试创建单独的特性文件。

  • trait(特征)类似于其他语言中的interface或者protocol,指定一个实际类型必须满足的功能集合 与interface不同的地方在于,interface会隐藏具体实现类型,而trait不会。在rust中,隐藏实现类型可以由generic配合trait作出。 Rust中的trait: trait关键字 trait对象

  •   VectorSlicer是一个转换器,输入一个特征向量输出一个特征向量,它是原特征的一个子集。这在从向量列中抽取特征非常有用。 VectorSlicer接收一个拥有特定索引的特征列,它的输出是一个新的特征列,它的值通过输入的索引来选择。有两种类型的索引: 1、整数索引表示进入向量的索引,调用setIndices() 2、字符串索引表示进入向量的特征列的名称,调用setNames()。这种情况需

  •   规则化器缩放单个样本让其拥有单位$L^{p}$范数。这是文本分类和聚类常用的操作。例如,两个$L^{2}$规则化的TFIDF向量的点乘就是两个向量的cosine相似度。   Normalizer实现VectorTransformer,将一个向量规则化为转换的向量,或者将一个RDD规则化为另一个RDD。下面是一个规则化的例子。 import org.apache.spark.SparkConte