如何用Jackson ObjectMapper将非基本类型字段序列化为字符串?
问题解答
是的,你确实需要自定义序列化器和反序列化器来实现这个需求。Jackson默认会将嵌套对象序列化为嵌套的JSON结构,目前没有现成的注解可以直接把对象序列化为它的JSON字符串表示,也没法直接把JSON字符串反序列回对象。
具体实现步骤
1. 自定义序列化器
这个序列化器会把SomeType2实例先序列化为JSON字符串,再以字符串形式写入最终的JSON结果:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; public class SomeType2ToStringSerializer extends JsonSerializer<SomeType2> { @Override public void serialize(SomeType2 value, JsonGenerator gen, SerializerProvider serializers) throws IOException { String jsonStr = serializers.getMapper().writeValueAsString(value); gen.writeString(jsonStr); } }
2. 给目标字段添加序列化注解
在SomeType1的d字段上标注@JsonSerialize,指定使用上面的自定义序列化器:
class SomeType1 { public String c; @JsonSerialize(using = SomeType2ToStringSerializer.class) public SomeType2 d; }
3. 自定义反序列化器(如果需要反序列化)
如果还要把JSON字符串反序列回SomeType2实例,需要实现对应的反序列化器:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import java.io.IOException; public class StringToSomeType2Deserializer extends JsonDeserializer<SomeType2> { @Override public SomeType2 deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String jsonStr = p.getText(); return ctxt.getMapper().readValue(jsonStr, SomeType2.class); } }
4. 给目标字段添加反序列化注解
同样在SomeType1的d字段上添加@JsonDeserialize注解:
class SomeType1 { public String c; @JsonSerialize(using = SomeType2ToStringSerializer.class) @JsonDeserialize(using = StringToSomeType2Deserializer.class) public SomeType2 d; }
这样处理后,执行objectMapper.writeValueAsString(value)就能得到你期望的JSON结果,反序列化时也能正常将字符串转回SomeType2对象。
内容的提问来源于stack exchange,提问作者GJ.
相关产品推荐
相关产品推荐

