【问题标题】:What's the best way to convert pojo to JSON in Spring在 Spring 中将 pojo 转换为 JSON 的最佳方法是什么
【发布时间】:2015-11-21 06:15:16
【问题描述】:

我需要在 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>

转换代码类似如下:

ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(new File("c:\\user.json"), user);

我的问题是:

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

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

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

非常感谢您提前回答。

【问题讨论】:

    标签: json spring jackson pojo


    【解决方案1】:

    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);
                }
            });
    }
    

    【讨论】:

    • Autowire ObjectMapper 的说明非常有帮助。谢谢。
    • 谢谢,这就是我想要的。注入的 ObjectMapper 已预先配置为比手动创建的映射器更好地处理各种数据类型。
    • 嗯,对我来说这个 ObjectMapper 是不满足的依赖。看起来像是我的问题的原因!
    【解决方案2】:

    如果你不想使用 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();
    }
    

    你必须像这样声明 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;
        }
    }
    

    【讨论】:

    • 我发现spring使用的是com.fasterxml.jackson,这就是maven库不同的原因。并且最新的库确实有一种方便的方法可以直接将 POJO 转换为 JSON 字符串:String jsonString = mapper.writeValueAsString(myResultObject);
    • 已经有一段时间了,这仍然是最好的方法吗?
    【解决方案3】:
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    
    public static String jsonToPojo(Object targetPojo) {
    
        if(targetPojo == null)
            return null;
        ObjectMapper mapper = new ObjectMapper();
    
        try {
             mapper.enable(SerializationFeature.INDENT_OUTPUT);
             return mapper.writeValueAsString(targetPojo);
    
        } catch (IOException e) {
            LOGGER.error("Error parsing string to json. Target pojo : {}", targetPojo.getClass().getName() );
        }
         return null;
    }
    

    【讨论】:

    • 方法名不应该是pojoToJSON吗?
    • @kellyfj 已更新。谢谢:)
    【解决方案4】:

    你应该在你的 pom.xml 文件中添加这样的代码

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
    

    然后你可以像这样在你的控制器返回对象

    @ResponseBody
    public TheClassYouDefine method(){
    
      return object;
    }
    

    jackson 会将对象转换为 json

    【讨论】:

    • 我的转换要求不是针对restful web service,我想将POJO转换为JSON并将json保存到数据库,@ResponseBody不适合我的情况。我想知道Spring是否在内部依赖Jackson进行转换,为什么jackson-apper-asl不包含在maven依赖层次结构中?在 Spring 项目中进行转换的最佳方法是什么(不使用 @ResponseBody)
    【解决方案5】:

    回答您的问题: 1.spring restful无法将pojo转换为json,它使用jackson来做到这一点,你必须像上面的答案一样添加两个lib。 2.您不需要将json写入任何文件,您可以在页面中获取json字符串,您可以使用ajax请求来获取它们。然后您可以使用jquery将它们放在页面中的任何位置。 3.不知道spring有在B/S应用中将pojo转json的机制,如果能告诉我怎么做,非常感谢

    【讨论】:

    • Spring MVC 确实支持返回 json,我们唯一应该做的就是使用@ResponseBody
    • 不要将每个“想法”作为单独的答案发布,请编辑您的答案以添加更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多