java – 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值.你有什么想法吗?

我收到一个带有Devices的列表,每个列表都包含Geography对象.该对象的参数为null / 0.我希望你明白.

@编辑@

我改变了
公共地理LastLocalization;

公共地图 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);
    }
}

最佳答案

@SerializedName("LastLocalization")
public Geography LastLocalization;

这个定义告诉Gson你期望一个名为LastLocalization的Geography类型对象,并且你想将它存储在一个名为LastLocalization的成员中.

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

当Gson遇到JSON中的LastLocalization对象时,它也会通过明确注释看到它应该匹配您的LastLocalization成员,因此它会创建一个新的Geography对象并将其分配到那里.它创建了一个Geography对象,因为它是成员的类型 – 没有别的意义.但是,JSON LastLocalization对象属性都不匹配任何Java Geography对象属性,因此Geography只包含Java对象的默认值.

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

点赞