1. 程式人生 > >自定義型別介面卡的Gson工具類

自定義型別介面卡的Gson工具類

在android開發以及javaEE的開發過程中,我們需要解析json,下面我為大家提供一個已經封裝好的工具類,在使用過程中,完全不需要再對gson作處理。一行程式碼即可以實現轉換

public final  class JsonUtil {
    private JsonUtil(){}

    /**
     * 物件轉換成json字串
     * @param obj
     * @return
     */
    public static String toJson(Object obj) {
        Gson gson = new GsonBuilder().registerTypeAdapter(Integer.class, new
IntegerDefault0Adapter()) .registerTypeAdapter(int.class, new IntegerDefault0Adapter()) .registerTypeAdapter(Double.class, new DoubleDefault0Adapter()) .registerTypeAdapter(double.class, new DoubleDefault0Adapter()) .registerTypeAdapter(Long.class, new
LongDefault0Adapter()) .registerTypeAdapter(long.class, new LongDefault0Adapter()) .create(); return gson.toJson(obj); } /** * json字串轉成物件 * @param str * @param type * @return */ public static <T> T fromJson(String str, Type type) { Gson gson = new
GsonBuilder().registerTypeAdapter(Integer.class, new IntegerDefault0Adapter()) .registerTypeAdapter(int.class, new IntegerDefault0Adapter()) .registerTypeAdapter(Double.class, new DoubleDefault0Adapter()) .registerTypeAdapter(double.class, new DoubleDefault0Adapter()) .registerTypeAdapter(Long.class, new LongDefault0Adapter()) .registerTypeAdapter(long.class, new LongDefault0Adapter()) .create(); return gson.fromJson(str, type); } /** * json字串轉成物件 * @param str * @param type * @return */ public static <T> T fromJson(String str, Class<T> type) { Gson gson = new GsonBuilder().registerTypeAdapter(Integer.class, new IntegerDefault0Adapter()) .registerTypeAdapter(int.class, new IntegerDefault0Adapter()) .registerTypeAdapter(Double.class, new DoubleDefault0Adapter()) .registerTypeAdapter(double.class, new DoubleDefault0Adapter()) .registerTypeAdapter(Long.class, new LongDefault0Adapter()) .registerTypeAdapter(long.class, new LongDefault0Adapter()) .create(); return gson.fromJson(str, type); } }

在這裡,我們使用了IntegerDefault0Adapter,DoubleDefault0Adapter,LongDefault0Adapter自定義型別介面卡,用來解決解析過程中的型別轉換異常

IntegerDefault0Adapter.java

public class IntegerDefault0Adapter implements JsonSerializer<Integer>, JsonDeserializer<Integer> {
    @Override
    public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        try {
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定義為int型別,如果後臺返回""或者null,則返回0
                return 0;
            }
        } catch (Exception ignore) {
        }
        try {
            return json.getAsInt();
        } catch (NumberFormatException e) {
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src);
    }
}

DoubleDefault0Adapter.java

public class DoubleDefault0Adapter implements JsonSerializer<Double>, JsonDeserializer<Double> {
    @Override
    public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定義為double型別,如果後臺返回""或者null,則返回0.00
                return 0.00;
            }
        } catch (Exception ignore) {
        }
        try {
            return json.getAsDouble();
        } catch (NumberFormatException e) {
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src);
    }
}

LongDefault0Adapter.java

public class LongDefault0Adapter implements JsonSerializer<Long>, JsonDeserializer<Long> {
    @Override
    public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        try {
            if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定義為long型別,如果後臺返回""或者null,則返回0
                return 0l;
            }
        } catch (Exception ignore) {
        }
        try {
            return json.getAsLong();
        } catch (NumberFormatException e) {
            throw new JsonSyntaxException(e);
        }
    }

    @Override
    public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src);
    }
}

相關推薦

定義型別介面卡Gson工具

在android開發以及javaEE的開發過程中,我們需要解析json,下面我為大家提供一個已經封裝好的工具類,在使用過程中,完全不需要再對gson作處理。一行程式碼即可以實現轉換 public final class JsonUtil { priv

Android定義介面卡繼承BaseAdapter,定義生成對話方塊工具

工作內容: 1.不使用SQLiteHelper獲取本地資料庫中的表的內容 2.自定義介面卡父類 3.自定義生成對話方塊的工具類 學習分享: 1.不使用SQLiteHelper,直接找到本地資料庫檔案開啟,並獲取其中的表內容 SQLiteDatabase  sqliteDat

定義MVC框架之工具-模型

else pri 數據庫連接 執行 field date http one www. 截止目前已經改造了5個類: ubuntu:通過封裝驗證碼類庫一步步安裝php的gd擴展 自定義MVC框架之工具類-分頁類的封裝 自定義MVC框架之工具類-文件上傳類 自定義MVC框

java定義排程定時器工具(java電商訂單自動失效或收貨)

java電商訂單超時改狀態工具類 最近在做一個電商專案,要求在使用者下單後未付款30分鐘後就將訂單的狀態改為失效,最初想的是用定時器沒幾秒去資料庫檢視有哪些訂單未付款但超過30分的,就修改狀態,這個方式有兩種缺點,一:如果時間設定的較短,就會導致一直在讀寫資料庫,二:如果時間設定較長就會

定義sio::message::ptr工具

class tool_map { public:     static bool try_get_value(sio::message::ptr& out_data,                               const char* key, sio

AsyncTask解析(下)——實現定義AsyncTask網路傳輸工具封裝

在上文: AsyncTask解析(上)——原理分析與超簡單demo實現中已經對AsyncTask的實現原理以及原始碼流程進行了一定的分析,相信大家已經基本熟悉了AsyncTask內部實現網路傳輸的呼叫順序以及過程細節,最後還寫出了一個比較簡單的Demo實踐,十分簡單易懂相信

Java中定義物件使用Collections工具中的Sort方法

Collections工具類中的sort方法有兩種形式: (1) sort(List<T> list) (2) sort(List<T> list, Comparator<? super T> c) 第一種方法中List型別的物件必須實現Comparable介面,此外,

Android 定義View之繪圖工具Canvas+Paint+Path(onDraw方法)基礎詳解

本章節講述三個繪圖工具類Canvas(畫布),Paint(畫筆),Path(路徑) 1.Canvas(畫布)相關方法詳解 1.1. 方法:Canvas() 作用:建立一個空的畫布,可以使

為Redis配置定義fastJson序列化工具

    alibaba.fastjson內部已經提供了對Redis儲存物件序列化的工具類GenericFastJsonRedisS

聯合體有使用者定義型別的處理辦法

聯合體內部如果有使用者自定義成員,那麼各種型別建構函式,拷貝函式,解構函式,均被定義為刪除的。所以使用者需要肩負起構造,析構的責任。採用如下例所示的方法!!!!  #include<iostream> #include<string> using n

定義redis序列化工具

我們 utils 字節數 pac keys ted ive onu 問題 redis一個優點就是可以將數據寫入到磁盤中。 我們知道寫入磁盤的數據實際上都是以字節(0101這樣的二進制數據)的形式寫入的。 這意味著如果我們要將一個對象寫入磁盤,就必須將這個對象序列化。 jav

定義 popWindow彈框 工具

popu second db2 oca pri dial motion void float   前言:因為Android 沒有像IOS一樣的ActionSheet,雖然在github上看到有一些類似ActionSheet的庫,總覺得不好用,不如自己寫一個彈框通用類,樣式全

C#定義處理xml數據實例

行數 tostring 圖片 跑步 判斷 rose bool ati map 本文實例講述了C#自定義處理xml數據類。分享給大家供大家參考。具體分析如下: 這個C#類專門用戶處理xml數據,可以大大簡化xml的操作,類中封裝了常用的xml操作,包括打開、讀取xml數據,

Laravel 5.5 FormRequest 定義表單請求驗證

根目錄 use his extends 數據 不一致 不能 登錄模塊 能夠 1、把表單驗證邏輯寫在Controller中,這是最基礎的方法,但是不好維護,如: 1 namespace App\Http\Controllers\Admin; 2 3 use Illu

[Doctrine Migrations] 數據庫遷移組件的深入解析三:定義數據字段

con 組件 extends arr TP value ctr ets field 自定義type 根據官方文檔,新建TinyIntType類,集成Type,並重寫getName,getSqlDeclaration,convertToPHPValue,getBindingT

定義型別 結構體型別建立 結構體初始化

結構體 結構體的基礎知識: 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。 結構體的宣告: struct tag //struct是結構體關鍵字,tag為結構體標籤 { member-list; //成員列表 }variable-list;//變

Qt中QVariant儲存定義型別

#include <QDebug> //先宣告類 class Test{ public: QString myName; }; //註冊自定義型別 Q_DECLARE_METATYPE(Test) int main(int argc, char *argv[]) {

定義型別的建立

建立自定義型別的最常見方式,就是組合使用建構函式模式與原型模式。 1 window.onload = function() { 2 var person1 = new Person("Nicholas", 29, "Software Engineer"); 3 var perso

Android應用--簡 美音樂播放器獲取專輯圖片(定義列表介面卡

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

postgresql定義型別並返回陣列

轉自 https://blog.csdn.net/victor_ww/article/details/44415895   create type custom_data_type as ( id int, name varchar(50), score decimal(