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 ,谢谢!

 

posted @ 2018-08-14 09:21  弹琴不谈情  阅读(932)  评论(0编辑  收藏  举报