JSON《===》JavaBean的相互轉換

 一、JSON的做用和好處

     在JavaWeb項目中先後端直接的交互,接口之間的對接等等,基本離不開JSON。html

    JSON: 全稱JavaScript Object Notation(JavaScript 對象表示法)java

    JSON 是存儲和交換文本信息的語法。相似 XML。apache

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

  二、配置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)、手動導入(版本不必定要相同)
app

 三、爲了更加方便的使用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;
  }
}

   四、接下來就能夠進行測試了。

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

  五、測試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);
  }

 

  六、後記

    有好多想寫下來的,但沒寫,不是什麼忙的,就是本身懶,想着,這弄一下,至少得個把或幾個小時。

    轉發請註明出處http://www.javashuo.com/article/p-eilvmihu-h.html ,謝謝!

相關文章
相關標籤/搜索