You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置FasterXML ObjectMapper正确处理空字符串及序列化异常

解决FasterXML ObjectMapper序列化String类型JSON字段的转义与空值问题

问题分析

你的核心矛盾在于answers字段存储的是JSON格式字符串:

  • 直接序列化时,双引号会被自动转义,导致原本的JSON结构被包裹成字符串形式
  • 用@JsonRawValue解决转义问题后,空字符串会被序列化为"answers" :这种无效JSON结构

解决方案

方法一:自定义序列化器(推荐)

给answers字段编写针对性的序列化逻辑,区分空值和非空值分别处理:

  1. 实现自定义序列化类:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;

public class RawStringSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        if (value == null || value.isEmpty()) {
            // 空值输出标准空字符串
            gen.writeString("");
        } else {
            // 非空值按原始JSON结构输出
            gen.writeRawValue(value);
        }
    }
}
  1. 在Survey类的answers字段上绑定序列化器:
public class Survey {
    private String id;
    
    @JsonSerialize(using = RawStringSerializer.class)
    private String answers;

    // getter、setter方法
}

处理后效果:

  • 当answers为有效JSON字符串时,直接输出对应的JSON结构(无转义)
  • 当answers为空或null时,输出"answers": "",保证JSON格式合法

方法二:修改字段类型(业务允许时优先)

如果业务场景支持,把answers的类型从String改成Object或对应POJO类,让Jackson自动处理序列化:

// 定义对应JSON结构的POJO类
public class Answers {
    private List<String> question3;

    // getter、setter方法
}

// 修改Survey类
public class Survey {
    private String id;
    private Answers answers;

    // getter、setter方法
}

这种方式更符合Jackson的设计规范,避免手动处理JSON字符串的麻烦,但需要同步调整数据存储和读取逻辑。

方法三:在getter方法中处理空值

不想写自定义序列化器的话,可在answers的getter方法中结合@JsonRawValue做空值判断:

public class Survey {
    private String id;
    private String answers;

    public String getId() {
        return id;
    }

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

    @JsonRawValue
    public String getAnswers() {
        // 空值时返回JSON格式的空字符串
        return (answers == null || answers.isEmpty()) ? "\"\"" : answers;
    }

    public void setAnswers(String answers) {
        this.answers = answers;
    }
}

这里返回的"\"\""是JSON标准的空字符串表示,Jackson会将其作为原始值输出,最终得到"answers": ""的合法结构。

验证结果

  • 当answers为"{\"question3\":[\"Item4\"]}"时,序列化输出:"answers" : {"question3":["Item4"]}
  • 当answers为空字符串时,序列化输出:"answers" : ""

内容的提问来源于stack exchange,提问作者rekotc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:22:22