Gson嵌套类参数没有值

时间:2016-02-22 00:59:47

标签: java android json gson

我遇到了将字符串解析为嵌套类的问题。这是我的json字符串:

[
 {
  "DeviceName":"devtest",
  "StolenFlag":false,
  "BatteryLevel":2,
  "LastLocalization":{
     "Geography":{
        "CoordinateSystemId":4326,
        "WellKnownText":"POINT (52.403371 16.955098)"
         }
      }
 },
 {
  "DeviceName":"testdev2",
  "StolenFlag":false,
  "BatteryLevel":2,
  "LastLocalization":{
     "Geography":{
        "CoordinateSystemId":4326,
        "WellKnownText":"POINT (16.955098 52.403371)"
         }
      }
 }
]

我的课程:

class Geography implements Parcelable{
    @SerializedName("CoordinateSystemId")
public int CoordinateSystemId;

@SerializedName("WellKnownText")
public String WellKnownText;
....
}

class MyDevice implements Parcelable{
    @SerializedName("DeviceName")
    public String DeviceName;

    @SerializedName("StolenFlag")
    public Boolean StolenFlag;

    @SerializedName("BatteryLevel")
    public int BatteryLevel;


    @SerializedName("LastLocalization")
    public Geography LastLocalization;

    ...
}

转换代码:

Gson gson = new Gson();
            List<MyDevice> MyDev = gson.fromJson(result, new TypeToken<List<MyDevice>>() {
            }.getType());

由于Device的参数转换正确,我在Device中的Geography对象中得到null / 0值。你有什么想法吗?

我收到一个包含设备的列表,每个包含Geography对象。该对象的参数为null / 0。我希望你明白。

@EDIT @

我改变了 public Geography LastLocalization;public Map<String, Geography> LastLocalization;

它工作正常,但在writeToParcel方法中出错。任何想法如何解决它?

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(DeviceName);
        dest.writeByte((byte) (StolenFlag ? 1 : 0));
        dest.writeInt(BatteryLevel);
        dest.writeParcelable(LastLocalization, 0);
    }
}

1 个答案:

答案 0 :(得分:1)

@SerializedName("LastLocalization")
public Geography LastLocalization;

此定义告诉Gson您期望一个名为LastLocalization的Geography类型对象,并且您希望将其存储在名为LastLocalization的成员中。

您的输入有一个对象数组,每个对象都包含一个名为LastLocalization的对象,该对象包含一个名为Geography的对象。

当Gson遇到JSON中的LastLocalization对象时,它还会看到 by explicity annotation 它应该与您的LastLocalization成员匹配,因此它会创建一个新的Geography对象并将其分配到那里。它创建了一个Geography对象,因为这是成员的类型 - 。但是,JSON LastLocalization对象属性都不匹配任何Java Geography对象属性,因此Geography只包含Java对象的默认值。

请注意Gson不关心JSON对象的名称是否与Java对象不同,因为您的Java对象被明确注释为接收具有不同JSON名称的内容。