JSON和java對象的互轉

来源:http://www.cnblogs.com/sundaymorning/archive/2017/09/06/7482721.html
-Advertisement-
Play Games

先說下我自己的理解,一般而言,JSON字元串要轉為java對象需要自己寫一個跟JSON一模一樣的實體類bean,然後用bean.class作為參數傳給對應的方法,實現轉化成功。 上述這種方法太麻煩了。其實有一種東西叫jsonObject可以直接不用新建實體類bean,而實現轉化,先說org.json ...


先說下我自己的理解,一般而言,JSON字元串要轉為java對象需要自己寫一個跟JSON一模一樣的實體類bean,然後用bean.class作為參數傳給對應的方法,實現轉化成功。

上述這種方法太麻煩了。其實有一種東西叫jsonObject可以直接不用新建實體類bean,而實現轉化,先說org.json.JSONObject這個JSONObject,貼上代碼:

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.json.JSONObject;

/**
* Json工具類,實現了實體類和Json數據格式之間的互轉功能 使用實例:<br>
*/
public class JsonUtils {
    /**
     * 將一個實體類對象轉換成Json數據格式
     * 
     * @param bean
     *            需要轉換的實體類對象
     * @return 轉換後的Json格式字元串
     */
    private static String beanToJson(Object bean) {
        StringBuilder json = new StringBuilder();
        json.append("{");
        PropertyDescriptor[] props = null;
        try {
            props = Introspector.getBeanInfo(bean.getClass(), Object.class)
                    .getPropertyDescriptors();
        } catch (IntrospectionException e) {
        }
        if (props != null) {
            for (int i = 0; i < props.length; i++) {
                try {
                    String name = objToJson(props[i].getName());
                    String value = objToJson(props[i].getReadMethod()
                            .invoke(bean));
                    json.append(name);
                    json.append(":");
                    json.append(value);
                    json.append(",");
                } catch (Exception e) {
                }
            }
            json.setCharAt(json.length() - 1, '}');
        } else {
            json.append("}");
        }
        return json.toString();
    }


    /**
     * 將一個List對象轉換成Json數據格式返回
     * 
     * @param list
     *            需要進行轉換的List對象
     * @return 轉換後的Json數據格式字元串
     */
    private static String listToJson(List<?> list) {
        StringBuilder json = new StringBuilder();
        json.append("[");
        if (list != null && list.size() > 0) {
            for (Object obj : list) {
                json.append(objToJson(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, ']');
        } else {
            json.append("]");
        }
        return json.toString();
    }

    /**
     * 將一個對象數組轉換成Json數據格式返回
     * 
     * @param array
     *            需要進行轉換的數組對象
     * @return 轉換後的Json數據格式字元串
     */
    private static String arrayToJson(Object[] array) {
        StringBuilder json = new StringBuilder();
        json.append("[");
        if (array != null && array.length > 0) {
            for (Object obj : array) {
                json.append(objToJson(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, ']');
        } else {
            json.append("]");
        }
        return json.toString();
    }

    /**
     * 將一個Map對象轉換成Json數據格式返回
     * 
     * @param map
     *            需要進行轉換的Map對象
     * @return 轉換後的Json數據格式字元串
     */
    private static String mapToJson(Map<?, ?> map) {
        StringBuilder json = new StringBuilder();
        json.append("{");
        if (map != null && map.size() > 0) {
            for (Object key : map.keySet()) {
                json.append(objToJson(key));
                json.append(":");
                json.append(objToJson(map.get(key)));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, '}');
        } else {
            json.append("}");
        }
        return json.toString();
    }

    /**
     * 將一個Set對象轉換成Json數據格式返回
     * 
     * @param set
     *            需要進行轉換的Set對象
     * @return 轉換後的Json數據格式字元串
     */
    private static String setToJson(Set<?> set) {
        StringBuilder json = new StringBuilder();
        json.append("[");
        if (set != null && set.size() > 0) {
            for (Object obj : set) {
                json.append(objToJson(obj));
                json.append(",");
            }
            json.setCharAt(json.length() - 1, ']');
        } else {
            json.append("]");
        }
        return json.toString();
    }

    private static String stringToJson(String s) {
        if (s == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            switch (ch) {
            case '"':
                sb.append("\\\"");
                break;
            case '\\':
                sb.append("\\\\");
                break;
            case '\b':
                sb.append("\\b");
                break;
            case '\f':
                sb.append("\\f");
                break;
            case '\n':
                sb.append("\\n");
                break;
            case '\r':
                sb.append("\\r");
                break;
            case '\t':
                sb.append("\\t");
                break;
            case '/':
                sb.append("\\/");
                break;
            default:
                if (ch >= '\u0000' && ch <= '\u001F') {
                    String ss = Integer.toHexString(ch);
                    sb.append("\\u");
                    for (int k = 0; k < 4 - ss.length(); k++) {
                        sb.append('0');
                    }
                    sb.append(ss.toUpperCase());
                } else {
                    sb.append(ch);
                }
            }
        }
        return sb.toString();
    }

    public static String objToJson(Object obj) {
        StringBuilder json = new StringBuilder();
        if (obj == null) {
            json.append("\"\"");
        } else if (obj instanceof Number) {
            Number num = (Number)obj;
            json.append(num.toString());
        } else if (obj instanceof Boolean) {
            Boolean bl = (Boolean)obj;
            json.append(bl.toString());
        } else if (obj instanceof String) {
            json.append("\"").append(stringToJson(obj.toString())).append("\"");
        } else if (obj instanceof Object[]) {
            json.append(arrayToJson((Object[]) obj));
        } else if (obj instanceof List) {
            json.append(listToJson((List) obj));
        } else if (obj instanceof Map) {
            json.append(mapToJson((Map) obj));
        } else if (obj instanceof Set) {
            json.append(setToJson((Set) obj));
        } else {
            json.append(beanToJson(obj));
        }
        return json.toString();
    }
    
    /**
      * @Title: json2Map
      * @Creater: chencc <br>
      * @Date: 2011-3-28 <br>
      * @Description: TODO轉化json2map
      * @param @param jsonString
      * @param @return
      * @return Map<String,Object>
      * @throws
     */
    @SuppressWarnings("unchecked")
    public static Map<String, Object> json2Map(String jsonString) {
        
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            if(null != jsonString && !"".equals(jsonString)){
                JSONObject jsonObject = new JSONObject(jsonString);
            
                Iterator keyIter = jsonObject.keys();
                String key = "";
                Object value = null;
            
                while (keyIter.hasNext()) {
                    key = (String) keyIter.next();
                    value = jsonObject.get(key);
                    map.put(key, value);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
    
    //測試方法
    public static void main(String[] args) {
        Map<String,Object> params = new HashMap<String,Object>();
        params.put("callId123", Integer.valueOf(1000));
        Map retMap = new HashMap();
        retMap.put("params", params);
        retMap.put("result", true);
        List ls = new ArrayList();
        ls.add(new HashMap());
        ls.add("hello world!!");
        ls.add(new String[4]);
        retMap.put("list", ls);
        
        String[] strArray = new String[10];
        strArray[1]="first";
        strArray[2]="2";
        strArray[3]="3";
        System.out.println("Boolean:"+JsonUtils.objToJson(true));
        System.out.println("Number:"+JsonUtils.objToJson(23.3));
        System.out.println("String:"+JsonUtils.objToJson("sdhfsjdgksdlkjfk\"sd,!#%$^&*#(*@&*%&*$fsdfsdfsdf"));
        System.out.println("Map :"+JsonUtils.objToJson(retMap));
        System.out.println("List:"+JsonUtils.objToJson(ls));
        System.out.println("Array:"+JsonUtils.objToJson(strArray));
        
        String json = JsonUtils.objToJson(retMap);
        Map r = JsonUtils.json2Map(json);
        System.out.println(r.get("callId123"));
        
        
    }
}

再來聊聊net.sf.json.JSONObject這個JSONObject,代碼如下

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.util.PropertyFilter;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonUtil {
    
    
    private static ObjectMapper objectMapper = null;
    /**
     * JSON初始化
     */
    static {
        objectMapper = new ObjectMapper();  
        //設置為中國上海時區  
        objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));  
        //空值不序列化  
        objectMapper.setSerializationInclusion(Include.NON_NULL);  
        //反序列化時,屬性不存在的相容處理  
        objectMapper.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);  
        //序列化時,日期的統一格式  
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));  

        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);  
        
    } 
    
    
    /**
     * 把對象轉換成為Json字元串
     *
     * @param obj
     * @return
     */
    public static String convertObjectToJson(Object obj) {
        if (obj == null) {
//                throw new IllegalArgumentException("對象參數不能為空。");
            return null;
        }
        try {
            return objectMapper.writeValueAsString(obj);

        }  catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }
    /**
     *  把json字元串轉成Object對象
     * @param jsonString
     * @return T
     */
    public static <T> T parseJsonToObject(String jsonString, Class<T> valueType) {
        
        if(jsonString == null || "".equals((jsonString))){
            return null;
        }
        try {
            return objectMapper.readValue(jsonString, valueType);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     *  把json字元串轉成List對象
     * @param jsonString
     * @return List<T>
     */
    @SuppressWarnings("unchecked")
    public static <T> List<T> parseJsonToList(String jsonString,Class<T> valueType) {
        
        if(jsonString == null || "".equals((jsonString))){
            return null;
        }
        
        List<T> result = new ArrayList<T>();
        try {
            List<LinkedHashMap<Object, Object>> list = objectMapper.readValue(jsonString, List.class);
            
            for (LinkedHashMap<Object, Object> map : list) {
                
                String jsonStr = convertObjectToJson(map);
                
                T t = parseJsonToObject(jsonStr, valueType);
                
                result.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    /**
     * JSON處理含有嵌套關係對象,避免出現異常:net.sf.json.JSONException: There is a cycle in the hierarchy的方法
     * 註意:這樣獲得到的字元串中,引起嵌套迴圈的屬性會置為null
     *
     * @param obj
     * @return
     */
    public static JSONObject getJsonObject(Object obj) {

        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
        jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
            
            @Override
            public boolean apply(Object source, String name, Object value) {
                if(value==null){
                    return true;
                }
                return false;
            }
        });
        return JSONObject.fromObject(obj, jsonConfig);
    }
    /**
     * JSON處理含有嵌套關係對象,避免出現異常:net.sf.json.JSONException: There is a cycle in the hierarchy的方法

     * 註意:這樣獲得到的字元串中,引起嵌套迴圈的屬性會置為null
     *
     * @param obj
     * @return
     */
    public static JSONArray getJsonArray(Object obj) {

        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);

        return JSONArray.fromObject(obj, jsonConfig);
    }
    /**
     * 解析JSON字元串成一個MAP
     *
     * @param jsonStr json字元串,格式如: {dictTable:"BM_XB",groupValue:"分組值"}
     * @return
     */
    public static Map<String, Object> parseJsonStr(String jsonStr) {

        Map<String, Object> result = new HashMap<String, Object>();

        JSONObject jsonObj = JsonUtil.getJsonObject(jsonStr);

        for (Object key : jsonObj.keySet()) {
            result.put((String) key, jsonObj.get(key));
        }
        return result;
    }

}

總結:net.sf.json.JSONObject這個屬於json-lib這個老牌的系列,依賴的包超級多,commons的lang、logging、beanutils、collections等組件都有。

而org.json則相對來說依賴的包少一些,速度和性能方面沒有怎麼進行測試。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們希望WCF客戶端調用採用透明代理方式,不用添加服務引用,也不用Invoke的方式,通過ChannelFactory<>動態產生通道,實現服務介面進行調用,並且支持async/await,當然也不用在Config中配置serviceModel。 服務端代碼: 代理類 動態創建服務對象,Channe ...
  • 以前對WinForm窗體顯示和窗體間傳值瞭解不是很清楚最近做了一些WinForm開發,把用到的相關知識整理如下 A.WinForm中窗體顯示顯示窗體可以有以下2種方法:Form.ShowDialog方法 (窗體顯示為模式窗體)Form.Show方法 (窗體顯示為無模式窗體) 2者具體區別如下:1.在 ...
  • 1 using System;//引入命名空間 2 namespace HelloWorldApplication //命名空間 3 { 4 class HelloWorld //類名 5 { 6 static void Main(string[] args) //主函數 7 { 8 /* 我的第一... ...
  • 靜態方法和非靜態方法的區別: 1.靜態方法不需要類實例化就可以調用,反之非靜態方法需要實例化後才能調用; 2.靜態方法只能訪問靜態成員和方法,非靜態方法都可以訪問; 3.靜態方法不能標記為override,導致派生類不能重寫,但是可以訪問; 4.靜態成員是在第一次使用時進行初始化。非靜態的成員是在創 ...
  • 1、簡述編譯型與解釋型語言的區別,且分別列出你知道的哪些語言屬於編譯型,哪些屬於解釋型? 編譯型是一次性將源碼翻譯成電腦可以讀懂的二進位,缺點是全部運行完才知道有問題的地方,要重新修改源碼,然後重新編譯,跨平臺性差如C、C++、Delphi等 解釋型是一句句的翻譯源碼,運行速度慢,但是源碼有問題可以 ...
  • 概述 for v in d.values(): for k,v in d.items(): for a in 'adfa': #判斷對象是否可迭代 from collections import Iterable isinstance('abc',Iterable) #添加下標 for x,y in ...
  • isinstance和issubclass isinstance()判斷一個對象是不是這個類的對象,傳兩個參數(對象,類) issubclass()判斷一個類是不是另一類的子類,傳兩個參數(子類,父類) class Foo: pass class Son(Foo): pass s = Son() # ...
  • 因為公司的需求,我使用了velocity模板進行文件生成。在這裡先記錄一下使用velocity模板時的一些小技巧: 1.截取字元串 註意,(1)需要使用.length()獲取字元串長度; (2)最好使用“+(-1)”的形式代替“-1”,因為velocity中對減號“-”的支持不友好,容易混淆。 2. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...