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

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

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

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

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

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

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

Gson能瞬間把它變成:

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

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

適配器界的變形金剛

TypeAdapter就像是不同部門的專員,每個(gè)類型都有自己的專屬處理員。比如遇到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);
        }
    }
}

反射處理的黑科技

當(dāng)遇到自定義類時(shí),反射適配器就開始騷操作了:

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(); // 不認(rèn)識的就扔掉
            }
        }
        in.endObject();
        return instance;
    }
}

工廠流水線的魔法

Gson內(nèi)部有個(gè)TypeAdapter生產(chǎn)流水線,用工廠模式高效制造適配器:

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

    public <T> TypeAdapter<T> getAdapter(TypeToken<T> type) {
        // 走流水線逐個(gè)車間問能不能生產(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;
    }
}

方案二:靈活派(實(shí)現(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();

忽略未知字段:避免解析報(bào)錯(cuò)

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

Gson像一支設(shè)計(jì)模式交響樂團(tuán):

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

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

? 反射機(jī)制:處理未知類型

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

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

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

2013-05-22 09:33:09

交互設(shè)計(jì)設(shè)計(jì)時(shí)間

2022-06-27 13:56:10

設(shè)計(jì)模式緩存分布式系統(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)

2020-09-16 08:20:52

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

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

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

2017-09-11 13:55:30

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

2013-11-08 09:15:32

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

2016-10-21 09:45:20

RustFedoraJava

2020-12-22 09:31:43

區(qū)塊鏈安全食品

2020-03-05 16:35:06

人臉識別口罩人工智能

2019-11-19 09:54:59

NBA機(jī)器學(xué)習(xí)數(shù)據(jù)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 2一3sex性hd | 国产一级片免费视频 | 国产精品精品 | 亚洲午夜av久久乱码 | 男女视频在线免费观看 | 午夜三区 | 成人性视频免费网站 | 日韩一区二区三区四区五区六区 | 日韩精品视频一区二区三区 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 欧美视频二区 | 男女下面一进一出网站 | 日本又色又爽又黄又高潮 | 成人黄色在线 | 精品亚洲永久免费精品 | 午夜一区 | 精品国产精品国产偷麻豆 | 国产一级视频免费播放 | 久久精品久久久久久 | 久久精品视频免费看 | 青青草华人在线视频 | 国产高清免费 | 国产成人综合一区二区三区 | 一级黄色毛片免费 | 免费在线观看成人av | 欧美午夜精品久久久久久浪潮 | 欧美色综合一区二区三区 | 亚洲三级av | 国产精品一区在线 | 精品一区二区三区在线观看国产 | 中文字幕韩在线第一页 | 国产h在线| 草樱av| 黄色毛片大全 | 国产乱码一二三区精品 | 日日操夜夜操天天操 | 精品欧美一区二区中文字幕视频 | 视频一区二区在线 | 久久久久久久久久久久91 | 91小视频在线 | 久久精品久久久久久 |