偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

拆解Gson內(nèi)核:當JSON遇上設(shè)計模式的浪漫邂逅

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

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

Gson:數(shù)據(jù)世界的翻譯官

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

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

Gson能瞬間把它變成:

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

核心機密:TypeAdapter聯(lián)盟

適配器界的變形金剛

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> {
    // 構(gòu)造器工廠
    private final ObjectConstructor<T> constructor;
    // 字段綁定表(像快遞單號對照表)
    private final Map<String, BoundField> boundFields;

    @Override
    public T read(JsonReader in) throws IOException {
        T instance= constructor.construct(); // 像拆快遞一樣創(chuàng)建對象
        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內(nèi)部有個TypeAdapter生產(chǎn)流水線,用工廠模式高效制造適配器:

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

    public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
        // 走流水線逐個車間問能不能生產(chǎn)
        for (TypeAdapterFactory factory : factories) {
            TypeAdapter<T> candidate = factory.create(this, type);
            if (candidate != null) {
                return candidate; // 找到能生產(chǎn)的車間
            }
        }
        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;
    }
}

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

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

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));
        // 轉(zhuǎn)換日期格式
        user.setBirthday(new Date(obj.get("birthday").getAsLong()));
        return user;
    }
}

開發(fā)小貼士

日期處理的坑:建議統(tǒng)一注冊日期適配器

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

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

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

Gson像一支設(shè)計模式交響樂團:

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

? 工廠模式:靈活創(chuàng)建對象

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

? 建造者模式:優(yōu)雅配置參數(shù)

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

責(zé)任編輯:武曉燕 來源: 沐雨花飛碟
相關(guān)推薦

2013-05-22 09:33:09

交互設(shè)計設(shè)計時間

2022-06-27 13:56:10

設(shè)計模式緩存分布式系統(tǒng)

2020-02-11 17:39:16

人工智能香水制造

2015-08-10 22:36:41

收益寶

2016-10-21 15:57:39

Rust編輯語言Fedora

2022-02-24 16:15:16

OpenHarmon鴻蒙OpenEuler

2017-06-28 11:34:55

銳捷 醫(yī)療 物聯(lián)網(wǎng)

2015-01-07 15:49:21

大數(shù)據(jù)SSD

2017-08-18 14:47:31

DDD微服務(wù)架構(gòu)

2025-09-04 07:52:16

2020-09-16 08:20:52

SD-WAN區(qū)塊鏈廣域網(wǎng)

2017-05-16 14:38:25

2013-11-08 09:15:32

大數(shù)據(jù)平板電腦

2016-10-21 09:45:20

RustFedoraJava

2011-03-16 14:51:35

2013-08-22 11:08:27

大數(shù)據(jù)商業(yè)只能Hadoop

2025-08-07 08:35:06

2017-09-11 13:55:30

前端JavaScript物聯(lián)網(wǎng)

2009-03-21 16:43:29

SOA虛擬化IT

2020-12-22 09:31:43

區(qū)塊鏈安全食品
點贊
收藏

51CTO技術(shù)棧公眾號