解析JSON阵列与不同的对象他们班

解析JSON阵列与不同的对象他们班

问题描述:

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

您的字段的名称应该等于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; 
} 

希望这有助于。