【问题标题】:Parse json array with different objects to their classes将具有不同对象的 json 数组解析为它们的类
【发布时间】:2016-03-02 10:38:56
【问题描述】:

我有以下 json:

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

字段 steps 只是一个 int,heartRates 是一个 int 数组。我想要 使用 gson 将其解析为两个类。 我在 stackoverflow 上发现了一个类似的问题:How parse json array with multiple objects by gson? 并尝试过,但没有奏效。这是我的代码:

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 为空,我不知道为什么。有人可以解释一下吗?或者有人知道更好的方法吗?

【问题讨论】:

    标签: java json parsing gson


    【解决方案1】:

    您的字段名称应与 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;
            //...
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      解码将是一个两步过程,使用基类解码并获取消息的标头。标头中的一个字段将是一个标识符,它将定义应该使用哪个子类来解码(在您的情况下,这将是“类型”)。将类型放入 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;
      }
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-15
        • 2023-03-22
        • 2023-03-22
        相关资源
        最近更新 更多