簡體   English   中英

用不同的對象解析json數組到他們的類

[英]Parse json array with different objects to their classes

我有以下json:

[
    {
        "type": 1,
        "Steps": {
            "steps": steps
        }
    },
    {
        "type": 2,
        "HeartRate": {
            "heartrates": heartRates
        }
    }
]

字段步驟只是一個int,heartRates是一個int的數組。 我想使用gson將此解析為兩個類。 我在stackoverflow上發現了類似的問題: gson如何解析具有多個對象的json數組? 並嘗試了一下,但沒有成功。 這是我的代碼:

public class DataModels extends ArrayList<DataModels.Container> {

public class Container {
    public int type;
    public Object object;
}

public class Steps {

    double steps;

    public Steps(double steps) {
        this.steps = steps;
    }

    public double getSteps() {
        return steps;
    }

    @Override
    public String toString() {
        return "Steps: " + steps;
    }

}

public class HeartRate {

    int heartRate;

    public HeartRate(int hr) {
        heartRate = hr;
    }

    public double getHeartRate() {
        return heartRate;
    }

    @Override
    public String toString() {
        return "Heart rate: " + heartRate;
    }

}
}

然后用於解析我的json:

public String getJSONMessage(String gearSData) {
    System.out.println(gearSData);
    Gson gson = new Gson();
    DataModels model = gson.fromJson(gearSData, DataModels.class);
    System.out.println(model);
    for (DataModels.Container container: model) {

        System.out.println(container.type);
        System.out.println(container.object);
        String innerJson = gson.toJson(container.object);
        System.out.println("InnerJson: " + innerJson);

        switch (container.type) {
            case 1:
                DataModels.Steps steps = gson.fromJson(innerJson, DataModels.Steps.class);
                System.out.println(steps);
                break;
            case 2:
                DataModels.HeartRate heartRate = gson.fromJson(innerJson, DataModels.HeartRate.class);
                System.out.println(heartRate);
                break;
        }
    }
}

該類型可以正確解析,但innerjson為null,我不知道為什么。 有人可以解釋一下,還是有人知道更好的方法?

您的字段名稱應與json中的字段相同。 我剛剛重命名了您的類的字段,您的代碼對我來說很好用:

public static String getJSONMessage(String gearSData) {
    System.out.println(gearSData);
    Gson gson = new Gson();
    DataModels model = gson.fromJson(gearSData, DataModels.class);
    System.out.println(model);
    for (DataModels.Container container : model) {

        System.out.println(container.type);
        String innerJson = gson.toJson(container.type == 1 ? container.Steps : container.HeartRate);
        System.out.println("InnerJson: " + innerJson);
        //...
    }
    return null;
}

public static class DataModels extends ArrayList<DataModels.Container> {
    public static class Container {
        public int type;
        public StepsType Steps; // object for type 1
        public HeartRateType HeartRate; // object for type 2
    }

    public static class StepsType {
        double steps;
        //...
    }

    public static class HeartRateType {
        int heartrates;
        //...
    }
}

我所做的是創建僅具有消息頭的基類。 然后創建從該基類繼承的幾個具有特定數據的類。

要解碼將需要兩個步驟,請使用基類進行解碼並獲取消息的標頭。 標頭中的字段之一將是一個標識符,該標識符將定義應使用哪個子類進行解碼(在您的情況下為“類型”)。 將類型放入Switch並使用適當的子類對整個消息進行解碼。

它看起來像這樣:

class Base {
    public int type;
}

class Sub1 extends Base {
    public String myDataString;
}

class Sub2 extends Base {
    public int myDataInt;
}

然后進行解碼

Base theBase = theGsonData.fromJson(theJsonString, Base.class);

Switch (theBase.type) {
case 1: Sub1 theSub1 = theGsonData.fromJson(theJsonString, Sub1.class); break;
case 2: Sub2 theSub2 = theGsonData.fromJson(theJsonString, Sub2.class); break;
}

希望這可以幫助。

暫無
暫無

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

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