在Spring中将pojo转换为JSON的最佳方法是什么?

mai*_*365 5 spring json pojo jackson

我需要在Spring项目中将POJO转换为JSON字符串.我知道Spring MVC提供了一种方便的方法来通过注释@ResponseBody在控制器中返回json,我想知道Spring如何在内部将pojo转换为JSON?从Spring MVC maven依赖的层次结构中,我找到了jackson-databind和jackson-core库.在阅读杰克逊教程时,它说不同的库:

<dependencies>
  <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.8.5</version>
  </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

转换代码如下:

ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("c:\\user.json"), user);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1:spring restful controller如何将POJO转换为JSON?通过使用杰克逊但不同的依赖库?

2:如果我使用上面的Jackson示例将POJO转换为JSON,我是否必须将json写入文件?是否可以直接获取JSON字符串?

3:在Spring项目中将POJO转换为JSON的最佳方法是什么 - 不使用@ResponseBody,因为我想将POJO转换为JSON并将其保存到数据库,@ ResponseBody用于提供宁静的服务,不适合我的情况.

非常感谢你提前回答.

小智 6

Spring Boot 使用 Jackson 库将 Java POJO 对象与 Json 相互转换。这些转换器是为 Rest 服务自动创建和使用的,用于将 Rest 方法返回的 POJO 对象转换为 Json(例如用 @ResponseBody 注释的 Rest 服务方法)。如果使用 Rest 服务,则 Spring 会自动创建 POJO/Json 转换器。如果你想在一些不同的情况下进行 POJO/Json 转换,你需要 com.fasterxml.jackson.databind.ObjectMapper。

避免通过 operator new 创建 ObjectMapper 实例,使用依赖注入注解 @Autowired 重用 Spring 应用程序上下文中已经可用的 ObjectMapper。Spring 会自动为您的 objectMapper 变量注入值。

public class clA {
    @Autowired
    private ObjectMapper objectMapper;

    public Optional<String> objToJson(MyObj obj) {

            try {
                String objJackson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj));
            } catch (JsonProcessingException e) {
                log.debug("failed conversion: Pfra object to Json", e);
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这就是我一直在寻找的。注入的 ObjectMapper 是预先配置的,可以比手动创建的映射器更好地处理各种数据类型。 (2认同)
  • 嗯,对我来说这个 ObjectMapper 是不满足的依赖关系。看起来像是我的问题的原因! (2认同)

小智 5

如果您不想使用 Spring MVC 将对象转换为 JSON 字符串,您可以这样做:

private JsonGenerator jsonGenerator = null;
private ObjectMapper objectMapper = null;
public void init(){
  objectMapper = new ObjectMapper();
  try{
     jsonGenerator = objectMapper.getJsonFactory().createJsonGenerator(System.out, JsonEncoding.UTF8);
     jsonGenerator.writeObject(bean); 
     objectMapper.writeValue(System.out, bean);
  }catch (IOException e) {
        e.printStackTrace();
  }
  jsonGenerator.flush();
  jsonGenerator.close();
}
Run Code Online (Sandbox Code Playgroud)

你必须像这样声明bean

public class AccountBean {
    private int id;
    private String name;
    private String email;
    private String address;
    private Birthday birthday;

    //getters, setters

    @Override
    public String toString() {
        return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现spring使用的是com.fasterxml.jackson,这就是maven库不同的原因。并且最新的库确实有一种方便的方法可以直接将 POJO 转换为 JSON 字符串: String jsonString = mapper.writeValueAsString(myResultObject); (2认同)