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

为何ObjectMapper的writeValueAsString方法返回空JSON对象?

问题:Java Object序列化为JSON时返回空对象

我需要将Java Object序列化为JSON,但调用writeValueAsString方法时返回空的JSON对象。以下是我的@RestController代码:

public String getReportsFromReporter(
            @PathVariable(name = "from") String from, 
            @PathVariable(name = "to") String to) throws IOException {
    String url = "example.com";
    ObjectMapper objectMapper = new ObjectMapper();
    ObjectForRequestToReporter objectForRequestToReporter =
                               new ObjectForRequestToReporter();
    objectForRequestToReporter.setToken(somedata);
    objectForRequestToReporter.setEmployee(somedata);
    objectForRequestToReporter.setFrom(from);
    objectForRequestToReporter.setTo(to);
    String jsonObject = objectMapper.writeValueAsString(objectMapper);
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    HttpEntity<String> entity = new HttpEntity<String>(jsonObject, httpHeaders);
    String ans = restTemplate.postForObject(url , entity, String.class);
    String test = objectMapper.writerWithDefaultPrettyPrinter()
                              .writeValueAsString(objectMapper);
    System.out.println(test);
    System.out.println(jsonObject);
    return ans;
}

System.out.println的输出结果为:

{ }
 {}

Gradle依赖配置如下:

implementation("com.fasterxml.jackson.core:jackson-annotations:2.14.2")
implementation("com.fasterxml.jackson.core:jackson-core:2.14.2")
implementation("com.fasterxml.jackson.core:jackson-databind:2.14.2")

待序列化的对象类定义如下:

@Data
public class ObjectForRequestToReporter {
    private String token;
    private String employee;
    private String from;
    private String to;
    private final int work_after = 0;
}

请问我哪里操作有误?该如何解决这个问题?


错误原因

核心错误是序列化对象传错了:你在调用writeValueAsString时,传入的是objectMapper实例本身,而不是你创建并赋值的objectForRequestToReporter对象。Jackson默认不会序列化ObjectMapper的内部属性,因此输出空JSON对象{}。

解决方法
  1. 修正序列化目标对象:将writeValueAsString的参数替换为objectForRequestToReporter:
// 修正第一处序列化
String jsonObject = objectMapper.writeValueAsString(objectForRequestToReporter);
// ...
// 修正测试用的序列化
String test = objectMapper.writerWithDefaultPrettyPrinter()
                          .writeValueAsString(objectForRequestToReporter);
  1. 处理final字段序列化(可选):
    你的实体类中有private final int work_after = 0,Lombok的@Data会为该字段生成getter方法,Jackson默认可以通过getter读取该值并序列化。如果发现该字段未出现在JSON中,可以给字段添加@JsonProperty注解确保Jackson识别:
@Data
public class ObjectForRequestToReporter {
    private String token;
    private String employee;
    private String from;
    private String to;
    @JsonProperty
    private final int work_after = 0;
}

修正后,序列化输出会包含你赋值的所有字段,示例输出:

{
  "token" : "somedata",
  "employee" : "somedata",
  "from" : "xxx",
  "to" : "xxx",
  "work_after" : 0
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:40:12