为何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对象{}。
解决方法
- 修正序列化目标对象:将
writeValueAsString的参数替换为objectForRequestToReporter:
// 修正第一处序列化 String jsonObject = objectMapper.writeValueAsString(objectForRequestToReporter); // ... // 修正测试用的序列化 String test = objectMapper.writerWithDefaultPrettyPrinter() .writeValueAsString(objectForRequestToReporter);
- 处理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
相关产品推荐
相关产品推荐

