【问题标题】:Read nested json objects that have been serialized via gson library读取已通过 gson 库序列化的嵌套 json 对象
【发布时间】:2015-06-17 20:02:10
【问题描述】:

我正在共享首选项中存储一个对象。为此,我在存储对象之前使用 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"
    }

这一切都有效,但在反序列化“设备”时无效,因为它是一个 BluetoothDevice 对象,而不是简单的字符串或 int 值。如何告诉我的 TypeAdapter 正确反序列化它?

下面看一下我的typeadapter的read方法:

    @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;
    }

【问题讨论】:

    标签: java json serialization gson deserialization


    【解决方案1】:

    是否有理由使用 TypeAdapter 而不是直接将 JSON 映射到对象?例如:

    Gson gson = new Gson();
    Info info = gson.fromJson(jsonString, Info.class)
    

    如果您需要使用JsonReader,那么您可以考虑通过调用reader.peek() 来使用JsonToken。然后,您将能够switch 超过令牌类型(BEGIN_OBJECTEND_OBJECTBEGIN_ARRAYSTRING...)。

    【讨论】:

    • 这是我最初使用的,它可以毫无问题地反序列化,但是在序列化时我会得到一个 stackoverflow 错误。我认为这是因为我遇到了递归限制,所以通过 typeadapter 准确指定我想要序列化的内容似乎已经解决了这个问题。我可以使用 peek() 看到设备的类型是 BEGIN_OBJECT,但是如何获取该对象并将其从该读取方法中转回 BluetoothDevice 对象?
    • 我接受了你的回答,因为我能够使用类型适配器来序列化数据,同时在读回对象时直接映射到对象。读取方法的主体只需 3 行代码:我的设备 DV; dv= gson.fromJson(in, myDevice.class);返回 dv;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多