第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用Gson解碼未知字段的JSON?

如何使用Gson解碼未知字段的JSON?

開(kāi)心每一天1111 2019-12-13 17:10:47
我有與此類(lèi)似的JSON:{  "unknown_field": {    "field1": "str",    "field2": "str",    "field3": "str",    "field4": "str",    "field5": "str"  }, ......}我創(chuàng)建了一些類(lèi)來(lái)映射這個(gè)jsonpublic class MyModel implements Serializable {  private int id;  private HashMap<String, Model1> models;  // getters and setter for id and models here}而Model1類(lèi)是僅包含String字段的簡(jiǎn)單類(lèi)。但這是行不通的。編輯:JSON格式如下所示:{    "1145": {        "cities_id": "1145",        "city": "Nawanshahr",        "city_path": "nawanshahr",        "region_id": "53",        "region_district_id": "381",        "country_id": "0",        "million": "0",        "population": null,        "region_name": "Punjab"    },    "1148": {        "cities_id": "1148",        "city": "Nimbahera",        "city_path": "nimbahera",        "region_id": "54",        "region_district_id": "528",        "country_id": "0",        "million": "0",        "population": null,        "region_name": "Rajasthan"    },     ...}
查看完整描述

1 回答

?
揚(yáng)帆大魚(yú)

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊

Gson 2.0+的解決方案

我剛剛了解到,使用更新的Gson版本,這非常簡(jiǎn)單:


GsonBuilder builder = new GsonBuilder();

Object o = builder.create().fromJson(json, Object.class);

創(chuàng)建的對(duì)象是一個(gè)Map(com.google.gson.internal.LinkedTreeMap),如果您打印它,它看起來(lái)像這樣:


{1145={cities_id=1145, city=Nawanshahr, city_path=nawanshahr, region_id=53, region_district_id=381, country_id=0, million=0, population=null, region_name=Punjab}, 

 1148={cities_id=1148, city=Nimbahera, city_path=nimbahera, region_id=54, region_district_id=528, country_id=0, million=0, population=null, region_name=Rajasthan}

...

使用自定義解串器的解決方案

(注意:除非您堅(jiān)持使用Gson 2.0之前的版本,否則您并不是真正的自定義反序列化器。但是了解如何在Gson中進(jìn)行自定義反序列化(和序列化)仍然很有用,并且通常最佳方法,具體取決于您要如何使用解析后的數(shù)據(jù)。)


因此,我們確實(shí)在處理隨機(jī)/可變字段名稱(chēng)。(當(dāng)然,這種JSON格式不是很好;這種數(shù)據(jù)應(yīng)該放在JSON數(shù)組中,在這種情況下,可以很容易地將其讀入List。哦,我們?nèi)匀豢梢越馕鏊?。?/p>


首先,這是我如何在Java對(duì)象中對(duì)JSON數(shù)據(jù)建模:


// info for individual city

public class City    {

    String citiesId;

    String city;

    String regionName;

    // and so on

}


// top-level object, containing info for lots of cities

public class CityList  {

    List<City> cities;


    public CityList(List<City> cities) {

        this.cities = cities;

    }

}

然后,解析。處理此類(lèi)JSON的一種方法是為頂級(jí)對(duì)象(CityList)創(chuàng)建自定義反序列化器。


像這樣:


public class CityListDeserializer implements JsonDeserializer<CityList> {


    @Override

    public CityList deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {

        JsonObject jsonObject = element.getAsJsonObject();

        List<City> cities = new ArrayList<City>();

        for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {

            // For individual City objects, we can use default deserialisation:

            City city = context.deserialize(entry.getValue(), City.class); 

            cities.add(city);

        }

        return new CityList(cities);

    }


}

需要注意的關(guān)鍵點(diǎn)是重新jsonObject.entrySet()調(diào)出所有頂級(jí)字段(名稱(chēng)如“ 1145”,“ 1148”等)的調(diào)用。這個(gè)堆棧溢出的答案幫助我解決了這個(gè)問(wèn)題。


完成下面的解析代碼。請(qǐng)注意,您需要使用registerTypeAdapter()注冊(cè)自定義序列化程序。


GsonBuilder builder = new GsonBuilder();

builder.registerTypeAdapter(CityList.class, new CityListDeserializer());

Gson gson = builder.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();

CityList list = gson.fromJson(json, CityList.class);

(這是我用來(lái)測(cè)試的完整的可執(zhí)行示例。除了Gson之外,它還使用Guava庫(kù)。)



查看完整回答
反對(duì) 回復(fù) 2019-12-14
  • 1 回答
  • 0 關(guān)注
  • 259 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)