2016-03-02 76 views
1

我有以下的JSON:解析JSON陣列與不同的對象他們班

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

場的步驟只是一個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爲空,我不知道爲什麼。有人可以解釋這一點嗎?或者有人知道更好的方法來做到這一點?

回答

2

您的字段的名稱應該等於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; 
     //... 
    } 
} 
0

我所做的是創建一個只有消息頭的基類。然後創建了幾個從該基類繼承並具有特定數據的類。

解碼將是一個兩個步驟的過程,使用基類來解碼並獲取消息的標題。標題中的其中一個字段將是一個標識符,用於定義應使用哪個子類進行解碼(在您的情況下,這將是「類型」)。將該類型放入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; 
} 

希望這有助於。