为何对象内的JSONObject序列化不符合预期?如何解决?
为何对象内的JSONObject序列化未按预期工作?
你遇到的问题是因为Jackson的ObjectMapper默认不支持org.json.JSONObject类的序列化——它会将JSONObject当作普通Java对象处理,输出其内部成员属性(比如empty、mapType),而非解析它包含的键值对。
以下是几种可行的解决方案:
解决方案1:改用Jackson原生JSON节点类型
直接将Random类中的JSONObject替换为Jackson提供的ObjectNode(属于com.fasterxml.jackson.databind.node包),Jackson可以原生识别并正确序列化该类型:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; class Random { String name; ObjectNode json; public Random(String name, ObjectNode json) { this.name = name; this.json = json; } } // 使用示例 ObjectMapper mapper = new ObjectMapper(); ObjectNode jsonNode = mapper.createObjectNode(); jsonNode.put("key", "value"); Random random = new Random("name", jsonNode); String result = mapper.writeValueAsString(random); // 输出:{"name":"name","json":{"key":"value"}}
解决方案2:为org.json.JSONObject自定义序列化器
如果必须保留org.json.JSONObject类型,可以通过自定义Jackson序列化器来处理:
- 编写自定义序列化器:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import org.json.JSONObject; import java.io.IOException; public class JSONObjectSerializer extends JsonSerializer<JSONObject> { @Override public void serialize(JSONObject jsonObject, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { // 将JSONObject转为原生JSON字符串写入 jsonGenerator.writeRawValue(jsonObject.toString()); } }
- 在
Random类的字段上添加注解指定序列化器:
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.json.JSONObject; class Random { String name; @JsonSerialize(using = JSONObjectSerializer.class) JSONObject json; public Random(String name, JSONObject json) { this.name = name; this.json = json; } }
- 原序列化代码无需修改,即可输出预期的JSON结构。
解决方案3:将JSONObject转为Map后存储
另一种简单方式是把org.json.JSONObject转为Java原生Map,Jackson可以原生正确序列化Map类型:
import org.json.JSONObject; import java.util.Map; class Random { String name; Map<String, Object> json; public Random(String name, Map<String, Object> json) { this.name = name; this.json = json; } } // 使用示例 JSONObject json = new JSONObject(); json.put("key", "value"); Map<String, Object> jsonMap = json.toMap(); // 需org.json版本支持toMap方法 Random random = new Random("name", jsonMap); String result = new ObjectMapper().writeValueAsString(random); // 输出:{"name":"name","json":{"key":"value"}}
内容的提问来源于stack exchange,提问作者tusharRawat
相关产品推荐
相关产品推荐

