我遇到了将字符串解析为嵌套类的问题。这是我的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);
}
}
答案 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名称的内容。