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

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

在json中找到具有不同類型值的相同鍵時(shí),gson解析錯(cuò)誤

在json中找到具有不同類型值的相同鍵時(shí),gson解析錯(cuò)誤

阿晨1998 2021-12-01 17:08:12
從 API(由 Jackson 生成)獲取大型 JSON 響應(yīng),并且該對象僅在響應(yīng)中第一次出現(xiàn)時(shí)才具有其值。第二次當(dāng)相同的對象(具有相同的鍵)到達(dá)時(shí),它被一些數(shù)字/id 替換。JSON 響應(yīng)看起來像[{id:1,Person:{name:"xyz",age:30}},{id:2,Person:1}]現(xiàn)在我想通過遵循 GSON 代碼將整個(gè)響應(yīng)存儲在列表中Type listType = new TypeToken<List<MainModel>>() {}.getType();yourMainList = new Gson().fromJson(myres, listType);//here myres is whole response and MainModel is my pojo class mapped with JSON response keys但是當(dāng)帶有 id/number 的重復(fù)鍵第二次到達(dá)響應(yīng)時(shí),它給了我以下錯(cuò)誤。IllegalStateException:應(yīng)為 BEGIN_OBJECT,但在第 1 行第 11935 列路徑 $[1] 處為 NUMBER。在 com.google.gson.stream.JsonReader.beginObject有沒有辦法在android中通過GSON解析這樣的JSON?
查看完整描述

2 回答

?
手掌心

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

一種選擇是JsonDeserializer對有問題的字段使用自定義,它可能是這樣的:


public class PersonDeSerializer implements JsonDeserializer<Person> {

    @Override

    public Person deserialize(JsonElement json, Type typeOfT, 

                JsonDeserializationContext context)

            throws JsonParseException {

        try {

            return context.deserialize(json, typeOfT);

        } catch (JsonSyntaxException e) {

            // return null to elave null or make whatever kind of a person

            return null;

        }

    }

}

然后您可以設(shè)置使用該適配器反序列化的有問題的字段,例如:


public class MainModel {

    private Long id;


    @JsonAdapter(PersonDeSerializer.class)

    private Person Person;  // should be person, but is Person in JSON

}


查看完整回答
反對 回復(fù) 2021-12-01
?
寶慕林4294392

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

您需要決定如何處理 Person 類的不同變體。這是使用com.google.gson.JsonParser執(zhí)行此操作的最簡單方法。


private void start() {

    String json = "[{id:1,Person:{name:\"xyz\",age:30}},\n" +

            "{id:2,Person:1}]";


    HashMap<Integer, Person> map = new HashMap<>();


    JsonArray items = new JsonParser().parse(json).getAsJsonArray();

    items.forEach(jsonElement -> {

        JsonObject jsonObject = jsonElement.getAsJsonObject();

        int id = jsonObject.get("id").getAsInt();

        JsonElement element = jsonObject.get("Person");

        if(element.isJsonObject()){

            JsonObject personObject = element.getAsJsonObject();

            Person person = new Person();

            person.name = personObject.get("name").getAsString();

            person.age = personObject.get("age").getAsInt();

            map.put(id, person);

        }

        else {

            int personValue = element.getAsInt();

            map.put(id, new Person(personValue));

        }

    });


    for (int id : map.keySet()) {

        Person person = map.get(id);

        Log.d("myTag", id + ", name: " + person.name + ", age: " + person.age);

    }

}


class Person{

    String name;

    int age;


    Person(){}


    Person(int personValue) {

        // decide how the object should look

    }

}

輸出:


1、姓名:xyz、年齡:30

2、姓名:空、年齡:0


如果您喜歡以更通用的方式工作而不用硬輸入您的字段名稱,您可以使用Gson 自定義反序列化


查看完整回答
反對 回復(fù) 2021-12-01
  • 2 回答
  • 0 關(guān)注
  • 261 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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