成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

拆解Gson內核:當JSON遇上設計模式的浪漫邂逅

開發 項目管理
調用gson.fromJson()時,不妨想象背后這支交響樂團正在為你演奏數據的魔法。好的庫設計就像樂譜,每個模式都在恰到好處的位置奏響和諧的旋律。?

最近在一個項目中,我像拆快遞一樣把JSON解析模塊從原生換成了Gson。這個過程中順便看了下Gson源碼里隱藏的設計美學,就像發現快遞盒里居然裝著巧克力!今天咱們就打開這個甜蜜的包裝,看看Gson是怎么用設計模式玩轉JSON的。

Gson:數據世界的翻譯官

Gson就像個語言天才,能瞬間把JSON字符串變成對象(反序列化),也能把對象打包成JSON包裹(序列化)。舉個栗子,當服務器扔給你這樣一坨數據:

{
  "name": "小明",
  "age": 18,
  "hobbies": ["coding", "gaming"]
}

Gson能瞬間把它變成:

Coder coder = new Gson().formJson(json, Code.class):

核心機密:TypeAdapter聯盟

適配器界的變形金剛

TypeAdapter就像是不同部門的專員,每個類型都有自己的專屬處理員。比如遇到Date類型,就派Date專員;遇到自定義的User類,就派反射專員。

// 以Date類型為例的簡化版適配器
public class DateTypeAdapter extends TypeAdapter<Date> {
    private final DateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        out.value(format.format(value)); // 把Date變成字符串
    }

    @Override
    public Date read(JsonReader in) throws IOException {
        try {
            return format.parse(in.nextString()); // 把字符串還原成Date
        } catch (ParseException e) {
            throw new JsonParseException(e);
        }
    }
}

反射處理的黑科技

當遇到自定義類時,反射適配器就開始騷操作了:

public class ReflectiveTypeAdapter<T> extends TypeAdapter<T> {
    // 構造器工廠
    private final ObjectConstructor<T> constructor;
    // 字段綁定表(像快遞單號對照表)
    private final Map<String, BoundField> boundFields;

    @Override
    public T read(JsonReader in) throws IOException {
        T instance= constructor.construct(); // 像拆快遞一樣創建對象
        in.beginObject();
        while (in.hasNext()) {
            String fieldName = in.nextName(); // 讀取字段名
            BoundField field = boundFields.get(fieldName);
            if (field != null) {
                field.read(in, instance); // 按字段賦值
            } else {
                in.skipValue(); // 不認識的就扔掉
            }
        }
        in.endObject();
        return instance;
    }
}

工廠流水線的魔法

Gson內部有個TypeAdapter生產流水線,用工廠模式高效制造適配器:

public class Gson {
    // 適配器工廠列表(生產車間集合)
    private final List<TypeAdapterFactory> factories;

    public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
        // 走流水線逐個車間問能不能生產
        for (TypeAdapterFactory factory : factories) {
            TypeAdapter<T> candidate = factory.create(this, type);
            if (candidate != null) {
                return candidate; // 找到能生產的車間
            }
        }
        throw new IllegalArgumentException("沒有適配器能處理: " + type);
    }
}

自定義你的專屬翻譯

方案一:全能型選手(繼承TypeAdapter)

適合需要精確控制序列化和反序列化的場景:

public class UserAdapter extends TypeAdapter<User> {
    @Override
    public void write(JsonWriter out, User user) throws IOException {
        out.beginObject();
        out.name("fullName").value(user.getName()); // 字段重命名
        out.name("age").value(user.getAge());
        out.endObject();
    }

    @Override
    public User read(JsonReader in) throws IOException {
        User user = new User();
        in.beginObject();
        while (in.hasNext()) {
            switch (in.nextName()) {
                case"fullName":
                    user.setName(in.nextString());
                    break;
                case"age":
                    user.setAge(in.nextInt());
                    break;
            }
        }
        in.endObject();
        return user;
    }
}

方案二:靈活派(實現接口)

適合只需要處理單方向的場景:

public class UserDeserializer implements JsonDeserializer<User> {
    @Override
    public User deserialize(JsonElement json, Type type, 
                            JsonDeserializationContext context) {
        JsonObject obj= json.getAsJsonObject();
        User user=new User();
        // 處理嵌套對象
        user.setAddress(context.deserialize(obj.get("address"), Address.class));
        // 轉換日期格式
        user.setBirthday(new Date(obj.get("birthday").getAsLong()));
        return user;
    }
}

開發小貼士

日期處理的坑:建議統一注冊日期適配器

Gson gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd HH:mm:ss")
    .create();

忽略未知字段:避免解析報錯

Gson gson = new GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .create();

Gson像一支設計模式交響樂團:

? 適配器模式:解決接口兼容問題

? 工廠模式:靈活創建對象

? 反射機制:處理未知類型

? 建造者模式:優雅配置參數

調用gson.fromJson()時,不妨想象背后這支交響樂團正在為你演奏數據的魔法。好的庫設計就像樂譜,每個模式都在恰到好處的位置奏響和諧的旋律。

責任編輯:武曉燕 來源: 沐雨花飛碟
相關推薦

2013-05-22 09:33:09

交互設計設計時間

2022-06-27 13:56:10

設計模式緩存分布式系統

2020-02-11 17:39:16

人工智能香水制造

2016-10-21 15:57:39

Rust編輯語言Fedora

2022-02-24 16:15:16

OpenHarmon鴻蒙OpenEuler

2015-08-10 22:36:41

收益寶

2015-01-07 15:49:21

大數據SSD

2017-08-18 14:47:31

DDD微服務架構

2017-06-28 11:34:55

銳捷 醫療 物聯網

2020-09-16 08:20:52

SD-WAN區塊鏈廣域網

2017-05-16 14:38:25

2009-03-21 16:43:29

SOA虛擬化IT

2011-03-16 14:51:35

2013-08-22 11:08:27

大數據商業只能Hadoop

2017-09-11 13:55:30

前端JavaScript物聯網

2013-11-08 09:15:32

大數據平板電腦

2016-10-21 09:45:20

RustFedoraJava

2020-12-22 09:31:43

區塊鏈安全食品

2020-03-05 16:35:06

人臉識別口罩人工智能

2019-11-19 09:54:59

NBA機器學習數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品日女人 | 久久久高清 | 综合久久综合久久 | 久久久久国产一级毛片 | 国产精品高潮呻吟久久aⅴ码 | 一区二区在线免费观看 | 欧美一区二区三区在线 | 成人免费视频在线观看 | 国产成人精品一区二区三 | 日韩欧美亚洲 | 久草网站 | 精品国产一区二区三区性色av | 伊人久久综合影院 | 精品国产欧美一区二区三区成人 | 国产欧美一区二区三区另类精品 | 欧美一级艳情片免费观看 | 中文字幕日韩欧美一区二区三区 | 精品乱码一区二区三四区视频 | 日韩在线免费视频 | 精品成人佐山爱一区二区 | 蜜桃特黄a∨片免费观看 | 毛片久久久 | 久久精品欧美视频 | 中文字幕 国产精品 | 超碰97免费观看 | 国产精品免费一区二区三区四区 | 国产精品久久久久久久久久久久久 | 国产精品99久久久久久宅男 | 91久久精品日日躁夜夜躁欧美 | 国产精品av久久久久久久久久 | 婷婷开心激情综合五月天 | 精品综合久久久 | 99精品视频免费观看 | 久久人体视频 | 欧美在线一区二区视频 | 欧美一级免费 | 国产精品91久久久久久 | 亚洲精品电影网在线观看 | 超碰在线免费 | 久久国产婷婷国产香蕉 | 九九福利|