簡體   English   中英

使用翻新Android解析JSON數據

[英]Parsing json data with retrofit android

我正在嘗試將json解析為創建的類,但在此類的字段中收到null。

json看起來像這樣:

{"13": [
    {  "id": 3654, "dateIn": "2017-02-13 13:13:13", "dateOut": "2017-02-13 15:13:13" },
    {  "id": 3656, "dateIn": "2017-02-13 17:13:13", "dateOut": "2017-02-13 17:13:13" },
    {  "id": 3655, "dateIn": "2017-02-13 16:13:13", "dateOut": "2017-02-13 17:13:13" }
    ],
"14": [
    {  "id": 3654, "dateIn": "2017-02-13 13:13:13", "dateOut": "2017-02-13 15:13:13" },
    {  "id": 3656, "dateIn": "2017-02-13 17:13:13", "dateOut": "2017-02-13 17:13:13" },
    {  "id": 3655, "dateIn": "2017-02-13 16:13:13", "dateOut": "2017-02-13 17:13:13" }
    ]
}

這是改造方法:

Call<WorkingMonth> callPings = HelperClass.getService().getPing(month, year);
callPings.enqueue(new Callback<WorkingMonth>() {
    @Override
    public void onResponse(Call<WorkingMonth> call, Response<WorkingMonth> response) {
        if (response.isSuccessful()) {
            WorkingMonth wm = response.body();
            wm.getWorkingDays();
        } else {

            Log.i(TAG, "error in downloading");
        }    
    }

    @Override
    public void onFailure(Call<WorkingMonth> call, Throwable t) {

        Log.i(TAG, t.toString());
    }
});

上班時間:

    public class WorkingMonth{

    private Map<String,List<Ping>> workingDays;

    public Map<String,List<Ping>> getWorkingDays() {
        return workingDays;
    }

    public void setWorkingDays(Map<String,List<Ping>> workingDays) {
        this.workingDays = workingDays;
    }

Ping類:

public class Ping {
private Long id;
private String dateIn;
private String dateOut;

//getters, setters
}

我收到類WorkingMonth的對象,但字段workingDays為空。 幫助將不勝感激。 謝謝!

UPDATE

我找到了解決方案。 我必須編寫自定義地圖解串器

private class HolderDeserializer implements JsonDeserializer<WorkingMonth> {

    @Override
    public WorkingMonth deserialize(JsonElement json, Type type, JsonDeserializationContext context)
            throws JsonParseException {

        Type mapType = new TypeToken<Map<String, List<Ping>>>() {}.getType();
        Map<String, List<Ping>> data = context.deserialize(json, mapType);

        return new WorkingMonth(data);
    }
}

接着

HolderDeserializer holderDeserializer = new HolderDeserializer();
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(WorkingMonth.class, holderDeserializer);
Gson gson = gsonBuilder.create();

Type responseType = new TypeToken<WorkingMonth>() {}.getType();
WorkingMonth response = gson.fromJson(json, responseType);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM