zoukankan      html  css  js  c++  java
  • JSON《===》JavaBean的相互转换

     1、JSON的作用和好处

         在JavaWeb项目中前后端直接的交互,接口之间的对接等等,基本离不开JSON。

        JSON: 全称JavaScript Object Notation(JavaScript 对象表示法)

        JSON 是存储和交换文本信息的语法。类似 XML。

        JSON 比 XML 更小、更快,更易解析

      2、配置jackson的jar包

      1)、最快的方式是在Spring boot中的pom.xml中加入

           <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.8.3</version>
            </dependency>
            
           <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>2.6</version>
           </dependency> 

         2)、手动导入(版本不一定要相同)

     3、为了更加方便的使用JSON,封装成一个jsonMapper工具类

    package com.djb.common.utils;
    
    import java.io.IOException;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    import com.fasterxml.jackson.core.JsonParser.Feature;
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.JavaType;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializationFeature;
    import com.fasterxml.jackson.databind.util.JSONPObject;
    
    public class JsonMapper {
      private static Log logger = LogFactory.getLog(JsonMapper.class);
    
      private static ObjectMapper mapper;
      private static JsonMapper _instance = new JsonMapper();
    
      private JsonMapper() {
        mapper = getMapper();
    
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    
        // 允许出现特殊字符和转义符
        mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    
        // 允许出现单引号
        mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);
      }
    
      /**
       * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合.
       * 
       * 如需读取集合如List/Map, 且不是List<String>这种简单类型时使用如下语句,使用後面的函数.
       */
      public <T> T fromJson(String jsonString, Class<T> clazz) {
        if (StringUtils.isEmpty(jsonString)) {
          return null;
        }
    
        try {
          return mapper.readValue(jsonString, clazz);
        } catch (IOException e) {
          logger.warn("parse json string error:" + jsonString, e);
          return null;
        }
      }
    
      /**
       * 如果JSON字符串为Null或"null"字符串, 返回Null. 如果JSON字符串为"[]", 返回空集合.
       * 
       * 如需读取集合如List/Map, 且不是List<String>时,
       * 先用constructParametricType(List.class,MyBean.class)构造出JavaTeype,再调用本函数.
       */
      @SuppressWarnings("unchecked")
      public <T> T fromJson(String jsonString, JavaType javaType) {
        if (StringUtils.isEmpty(jsonString)) {
          return null;
        }
    
        try {
          return (T) mapper.readValue(jsonString, javaType);
        } catch (IOException e) {
          logger.warn("parse json string error:" + jsonString, e);
          return null;
        }
      }
    
      /**
       * 构造泛型的Type如List<MyBean>, Map<String,MyBean>
       */
      public JavaType constructParametricType(Class<?> parametrized, Class<?>... parameterClasses) {
        return mapper.getTypeFactory().constructParametricType(parametrized, parameterClasses);
      }
    
      /**
       * 如果对象为Null, 返回"null". 如果集合为空集合, 返回"[]".
       */
      public String toJson(Object object) {
    
        try {
          return mapper.writeValueAsString(object);
        } catch (IOException e) {
          logger.warn("write to json string error:" + object, e);
          return null;
        }
      }
    
      /**
       * 输出JSONP格式数据.
       */
      public String toJsonP(String functionName, Object object) {
        return toJson(new JSONPObject(functionName, object));
      }
    
      /**
       * 取出Mapper做进一步的设置或使用其他序列化API.
       */
      public static ObjectMapper getMapper() {
        if (mapper == null) {
          mapper = new ObjectMapper();
        }
        return mapper;
      }
    
      /**
       * 获取实例
       * 
       * @return
       */
      public static JsonMapper getInstance() {
        return _instance;
      }
    }

       4、接下来就可以进行测试了。

    package com.lrj;
    
    import java.util.Map;
    
    import com.lrj.bean.Developer;
    import com.lrj.common.JsonMapper;
    
    public class Test01 {
        
        public static void main(String[] args) {
            
            Developer developer = new Developer();
            developer.setName("Jack");
            developer.setAge(22);
            developer.setDept("IT");
         developer.setSaraly(8000D); developer.setAddress(
    "博客园"); //对于复杂的list,要先转换为map集合,再转为对象 String jsonStr = "{"developer":"{\"name\":\"Jack\",\"age\":22,\"saraly\":8000.0,\"address\":\"博客园\",\"dept\":\"IT\"}","other":null}"; Map<String, Object> map = JsonMapper.getInstance().fromJson(jsonStr, Map.class); String beanStr = map.get("developer") + ""; Developer developer3 = JsonMapper.getInstance().fromJson(beanStr, Developer.class); System.out.println(developer3); String jsonString = JsonMapper.getInstance().toJson(developer); System.out.println(jsonString); Developer developer2 = JsonMapper.getInstance().fromJson(jsonString, Developer.class); System.out.println(developer2); } }

      5、测试json是否合法,已经将json转化为实体类的网站

        http://www.bejson.com/json2javapojo/new/

        当遇到json转换异常时可以,先debug或者输出json字符串,复制到网站测试是否通过,来帮助排查错误。

     

    注意:转化的json不是简单的list<String>即js对象中含有其他对象,用java实体类来讲,就是一个类中包含其他类,

       此时得先将json转化为Map<String, Object>,再取出其中想要的对象,转化为实体类。

    例如:

        Map<String, Object> map = JsonMapper.getInstance().fromJson(JSONStr, Map.class);
       String bean = map.get("Bean") + "";
        if (UtilPublic.notEmpty(pickup)) {
              Bean b = JsonMapper.getInstance().fromJson(bean, Bean.class);
      }

      6、后记

        有好多想写下来的,但没写,不是什么忙的,就是自己懒,想着,这弄一下,至少得个把或几个小时。

        转发请注明出处https://www.cnblogs.com/lrj1009IRET/p/9454728.html ,谢谢!

  • 相关阅读:
    MVC Form
    The way to learn english
    Test FastThree
    C#中Trim()、TrimStart()、TrimEnd()的用法
    c# Dictionary 简介
    visual studio快捷键大全
    ASP.NET MVC 中 ActionResult
    MVC4中使用 Ninject
    MVC Chapter 12 Overview of MVC Projects
    ASP.NET Razor
  • 原文地址:https://www.cnblogs.com/lrj1009IRET/p/9454728.html
Copyright © 2011-2022 走看看