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

为何对象内的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序列化器来处理:

  1. 编写自定义序列化器:
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());
    }
}
  1. 在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;
    }
}
  1. 原序列化代码无需修改,即可输出预期的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:47:15