首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将具有不同对象的json数组解析为它们的类

将具有不同对象的json数组解析为它们的类
EN

Stack Overflow用户
提问于 2016-03-02 10:38:56
回答 2查看 3.6K关注 0票数 2

我有以下的json:

代码语言:javascript
复制
[
    {
        "type": 1,
        "Steps": {
            "steps": steps
        }
    },
    {
        "type": 2,
        "HeartRate": {
            "heartrates": heartRates
        }
    }
]

字段步骤只是一个int,heartRates是一个int数组,我想使用gson将其解析为两个类。我在堆栈溢出中发现了一个类似的问题:How parse json array with multiple objects by gson?并尝试了它,但没有成功。这是我的密码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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是空的,我不知道为什么。有人能解释一下吗?还是有人知道更好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-02 11:08:57

您的字段的名称应该等于json中的字段。我刚刚重命名了类的字段,您的代码对我很好:

代码语言:javascript
复制
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;
        //...
    }
}
票数 2
EN

Stack Overflow用户

发布于 2016-03-02 11:28:57

我所做的是创建一个只有消息头的基类。然后创建几个继承自该基类的类,这些类具有特定的数据。

要解码需要两个步骤,使用基类对消息进行解码并获取消息头。标头中的一个字段将是一个标识符,该标识符将定义应该使用哪个子类进行去编码(在您的示例中是"type")。将类型放在一个开关中,并使用适当的子类来解码整个消息。

看起来会是这样的:

代码语言:javascript
复制
class Base {
    public int type;
}

class Sub1 extends Base {
    public String myDataString;
}

class Sub2 extends Base {
    public int myDataInt;
}

然后转到去代码

代码语言:javascript
复制
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;
}

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35744791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档