使用了原生Gson工具類解決按屬性名大寫轉換問題

前言:項目中使用http協議調用接口時,如何被調用方設置的是httpbody請求加密的格式的話,就需要我們傳入參數的對象按照本身的屬性值傳入,這樣的話,就會有兩個條件:1、屬性名大小寫必須一致;2、空值的屬性不能轉換成jsonMap中的key和value值;

我們會想到使用fastJson工具類進行轉換,將一個對象的所有屬性轉換成jsonMap形式,假如如果使用fastJson進行轉換的話,並不能將一個帶有空值屬性去掉,也不能保證轉換後的key值和屬性值完全一致(大小寫問題);

基於這種情況,可以這樣處理:

    /**
     * POST請求
     * 帶參數、請求頭, application/json 格式
     * 使用了Gson將bean-->json格式,解決了按屬性名大寫轉換問題
     * @author: 研發部-sunwh
     * @param <T> 請求參數封裝的實體
     * @param url
     * @param headers
     * @param params
     * @return
     * @throws UnsupportedEncodingException
     */
    public static <T> String httpPostJsonRequest(String url, Map<String, Object> headers, T bean) throws UnsupportedEncodingException {
        
    	log.info("http request url:{}, params:{}, headers:{}", url,GsonUtil.util().tojsonString(bean), headers);
        HttpPost httpPost = new HttpPost(url);
        StringEntity stringEntity = new StringEntity(GsonUtil.util().tojsonString(bean));
        stringEntity.setContentType("application/json");
        httpPost.setEntity(stringEntity);
        for (Map.Entry<String, Object> param : headers.entrySet()) {
            httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
        }
        return getResult(httpPost);
    }

GsonUtil方法如下:

package com.zcy.rflow.common.utils;

import org.springframework.util.ObjectUtils;

import com.google.gson.Gson;

/**
 * Gson工具類
 * 靜態內部類的單例模式
 * @author: 研發部-sunwh
 * @since: 2018年7月3日下午1:49:03 
 * @version: 1.0
 */
public class GsonUtil {

	private GsonUtil() {}
	
	private static class singletonBuild {
		private static GsonUtil value = new GsonUtil();
	}
	
	public static GsonUtil util() {
		return singletonBuild.value;
	}
	
	private Gson gson = new Gson();
	
	/**
	 * bean轉換json
	 * 解決對象屬性名大寫自動變爲小寫問題,即轉換後字符串是原本屬性名
	 * @author: 研發部-孫文豪
	 * @param bean
	 * @return
	 */
	public <T> String tojsonString(T bean) {
		
		if(ObjectUtils.isEmpty(bean)) {
			return null;
		}
		return gson.toJson(bean);
	}
}

這樣解決了上述兩種問題。

附上將對象轉換成LinkedHashMap,並解決屬性轉換順序問題

    /**
     * 將對象轉換成LinkedHashMap
	 * 解決屬性轉換順序問題
     * @author: 研發部-sunwh
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    public static LinkedHashMap<String, Object> objectToLinkedHasHMap(Object obj) throws IllegalAccessException {
    	
      LinkedHashMap<String, Object> linkedHashMap = new LinkedHashMap<>();
      Class<?> clazz = obj.getClass();
      for (Field field : clazz.getDeclaredFields()) {
      	  //修改訪問權限
          field.setAccessible(true);
          String fieldName = field.getName();
          Object value = field.get(obj);
          //剔除空值屬性
          if(ObjectUtils.isEmpty(fieldName) || ObjectUtils.isEmpty(value)) {
        	  continue;
          }
          linkedHashMap.put(fieldName, value);
      }
      return linkedHashMap;
  }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章