读取已通过 gson 库序列化的嵌套 json 个对象
Read nested json objects that have been serialized via gson library
我正在共享首选项中存储一个对象。为此,我在存储对象之前使用 gson 库和类型适配器对对象进行了序列化。
这是我的对象在 json 中的样子:
{
"id": 0,
"name": "Sensor 2D:D3:5C",
"address": "00:07:80:2D:D3:5C",
"device": {
"mAddress": "00:07:80:2D:D3:5C"
},
"temp": "31342e37"
}
这一切都有效,但在反序列化 "device" 时无效,因为它是一个 BluetoothDevice 对象,而不是简单的字符串或 int 值。我怎样才能告诉我的 TypeAdapter 正确反序列化它?
看一下我的类型适配器的读取方法:
@Override
public myDevice read(final JsonReader in) throws IOException {
final myDevice dv= new myDevice();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "id":
dv.setId(in.nextInt());
break;
case "name":
dv.setName(in.nextString());
break;
case "address":
dv.setAddress(in.nextString());
break;
case "temp":
dv.setTemp(in.nextString());
break;
case "device":
//What do I do here??
//dv.setDevice(in.????);
break;
}
}
in.endObject();
return vd;
}
是否有理由使用 TypeAdapter
而不是直接将 JSON 映射到对象中?例如:
Gson gson = new Gson();
Info info = gson.fromJson(jsonString, Info.class)
如果您需要使用JsonReader
,那么您可以考虑通过调用reader.peek()
来使用JsonToken
。然后,您将能够 switch
令牌类型(BEGIN_OBJECT
、END_OBJECT
、BEGIN_ARRAY
、STRING
...)。
我正在共享首选项中存储一个对象。为此,我在存储对象之前使用 gson 库和类型适配器对对象进行了序列化。
这是我的对象在 json 中的样子:
{
"id": 0,
"name": "Sensor 2D:D3:5C",
"address": "00:07:80:2D:D3:5C",
"device": {
"mAddress": "00:07:80:2D:D3:5C"
},
"temp": "31342e37"
}
这一切都有效,但在反序列化 "device" 时无效,因为它是一个 BluetoothDevice 对象,而不是简单的字符串或 int 值。我怎样才能告诉我的 TypeAdapter 正确反序列化它?
看一下我的类型适配器的读取方法:
@Override
public myDevice read(final JsonReader in) throws IOException {
final myDevice dv= new myDevice();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "id":
dv.setId(in.nextInt());
break;
case "name":
dv.setName(in.nextString());
break;
case "address":
dv.setAddress(in.nextString());
break;
case "temp":
dv.setTemp(in.nextString());
break;
case "device":
//What do I do here??
//dv.setDevice(in.????);
break;
}
}
in.endObject();
return vd;
}
是否有理由使用 TypeAdapter
而不是直接将 JSON 映射到对象中?例如:
Gson gson = new Gson();
Info info = gson.fromJson(jsonString, Info.class)
如果您需要使用JsonReader
,那么您可以考虑通过调用reader.peek()
来使用JsonToken
。然后,您将能够 switch
令牌类型(BEGIN_OBJECT
、END_OBJECT
、BEGIN_ARRAY
、STRING
...)。