我有以下的json:
[
{
"type": 1,
"Steps": {
"steps": steps
}
},
{
"type": 2,
"HeartRate": {
"heartrates": heartRates
}
}
]字段步骤只是一个int,heartRates是一个int数组,我想使用gson将其解析为两个类。我在堆栈溢出中发现了一个类似的问题: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是空的,我不知道为什么。有人能解释一下吗?还是有人知道更好的方法?
发布于 2016-03-02 11:08:57
您的字段的名称应该等于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;
//...
}
}发布于 2016-03-02 11:28:57
我所做的是创建一个只有消息头的基类。然后创建几个继承自该基类的类,这些类具有特定的数据。
要解码需要两个步骤,使用基类对消息进行解码并获取消息头。标头中的一个字段将是一个标识符,该标识符将定义应该使用哪个子类进行去编码(在您的示例中是"type")。将类型放在一个开关中,并使用适当的子类来解码整个消息。
看起来会是这样的:
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;
}希望这能有所帮助。
https://stackoverflow.com/questions/35744791
复制相似问题