【问题标题】:Gson nested class parameters have no valuesGson嵌套类参数没有值
【发布时间】:2016-02-22 00:59:47
【问题描述】:

我在将字符串解析为嵌套类时遇到问题。这是我的 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 值。你有什么想法为什么?

我收到一个包含设备的列表,每个都包含地理对象。该对象的参数为 null/0。希望你能理解。

@EDIT@

我变了 public Geography LastLocalization;public Map&lt;String, Geography&gt; 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);
    }
}

【问题讨论】:

  • 还有一个你没有考虑到的额外级别:LastLocalization 不是Geography 对象,它是一个具有Geography 字段的对象,它是Geography 对象.
  • 我明白,但是在我的服务器设备类只有一个地理对象时怎么可能呢?太奇怪了。
  • public Geography LastLocalization;更改为public Map&lt;String, Geography&gt; LastLocalization;
  • 现在工作得很好——我得到了价值。但是现在我在设备的 writeToParcel 方法中遇到了dest.writeParcelable(LastLocalization, 0); 的错误。不知道如何解决这个问题,因为我需要实现这个接口。
  • 试试dest.writeParcelable(LastLocalization.get("Geography"), 0);

标签: java android json gson


【解决方案1】:
@SerializedName("LastLocalization")
public Geography LastLocalization;

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2014-08-30
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多