如何配置FasterXML ObjectMapper正确处理空字符串及序列化异常
解决FasterXML ObjectMapper序列化String类型JSON字段的转义与空值问题
问题分析
你的核心矛盾在于answers字段存储的是JSON格式字符串:
- 直接序列化时,双引号会被自动转义,导致原本的JSON结构被包裹成字符串形式
- 用
@JsonRawValue解决转义问题后,空字符串会被序列化为"answers" :这种无效JSON结构
解决方案
方法一:自定义序列化器(推荐)
给answers字段编写针对性的序列化逻辑,区分空值和非空值分别处理:
- 实现自定义序列化类:
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); } } }
- 在
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
相关产品推荐
相关产品推荐

