【问题标题】:Jackson map special character to null杰克逊将特殊字符映射为空
【发布时间】:2015-11-03 12:22:20
【问题描述】:

如何配置 Jackson json 反序列化器,使特殊字符“##”、“#null”、“-”变为 null

例如: 说我的json是

{ "userId":"kp","fname":"k","lname":"p","mname":"##", rndNum:"-"}

而Java类是

class User{
    private String userId;
    private String fname;
    private String lname;
    private String mname;
    private Integer rndNum;

    //getters/ and setters
}

我希望输出是

user.getUserId() = kp
user.getMname() = null
user.getRndNum() = null

【问题讨论】:

    标签: java jackson


    【解决方案1】:

    最简单的方法是为此使用构造函数和验证器。例如

    public static String validate(String name) {
        if (name != null && !name.isEmpty() && (name.charAt(0) == '#' || name.charAt(0) == '-')) {
            return null;
        }
        return name;
    }
    
    class User {
        User(String userId, String fname, String lname, String mname) {
            this.userId = validate(userId);
            this.fname = validate(fname);
            this.lname = validate(lname);
            this.mname = validate(mname);
        }
    

    我也认为这恰当地分离了功能。 Jackson 代码和注释应该处理 JSON 中发生的任何内容的反序列化。您的类应该知道用于初始化的值是否有效,无论它们来自何处。

    【讨论】:

    • 我又添加了一个场景,整数是空字符。 Jackson 会调用构造函数来初始化字段吗?
    • 如果类 User 具有非原始字段,这些字段要么在 User 构造函数中构造,要么在各自的设置器中构造,或者如果它们是公共的则直接构造。杰克逊可以使用其中任何一种。如果您采用上述方法,您将需要一个验证器 Integer
    【解决方案2】:

    根据您需要的高级解决方案,有两种方法可以做到这一点:

    • There 是一种简单的方法,如果您愿意逐个注册您的类型。在此解决方案中,您提供了从原始 Jackson 对象到所需输出的反序列化代码。

    • 或者您可以使用更强大的解决方案,通过使用custom provider 覆盖所有类型来覆盖默认序列化程序。在这里,您定义了一般应如何反序列化字符串。

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2012-10-01
      • 1970-01-01
      相关资源
      最近更新 更多