我有一个2MB-4MB的来自服务器的JSON字符串,我无法控制它(服务器还是传入的JSON),所以字符串的格式就是它的格式。

我使用了来自org.jsonschema2pojo groupId的jsonschema2pojo-core artifactId从JSON字符串自动生成Java类。一切正常,直到到达JSON字符串的特定部分为止,我需要对它的处理方式与JSON表示的方式不同。

我需要以不同方式处理的JSON字符串部分的布局如下(尤其是“ class6”类。

{
    "class1": {
        "class2": {
            "class3": [{
                    "class4": {
                        "class5": [{
                                "class6": {
                                    "str1": 2,
                                    "str2": 3,
                                    "str3": 2,
                                    "str4": 3,
                                    "str5": 2
                                }
                            }, {
                                "class6": {
                                    "str1": 2,
                                    "str2": 3,
                                    "str3": 2,
                                    "str4": 3,
                                    "str5": 2
                                }
                            }, {
                                "class6": {
                                    "str1": 2,
                                    "str2": 3,
                                    "str3": 2,
                                    "str4": 3,
                                    "str5": 2
                                }
                            }
                        ]
                    },
                }
            ],
        },
    },
}


类别6中的项目数量和名称一样是可变的。以上名称和数量仅是说明性的。

Java生成器吐出一个Class6类,该类具有名为str1的Long,名为str2的Long等。

我真正需要的是一个Class6类,其中有一个映射或2D数组(这并不重要,但我的目标是HashMap),其中str1是String而不是一个类的名称, int右侧的:是与其关联的值(因此为HashMap)。

我很难找出如何执行此操作(解串器与类型适配器?),但最终我得到的是:

public class Class6TypeAdapter extends TypeAdapter<Class6> {

    @Override
    public void write(JsonWriter writer, Class6 t) throws IOException {
        //I only deserialize, never serialize
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Class6 read(JsonReader reader) throws IOException {
        if (reader.peek() == JsonToken.NULL) {
            reader.nextNull();
            return null;
        }
        Class6 class6 = new Class6();
        while (reader.hasNext()) {
            if (reader.peek() == JsonToken.BEGIN_OBJECT) {
                reader.beginObject();
            }

            String name = null;
            if (reader.hasNext() && (reader.peek() == JsonToken.NAME)) {
                name = reader.nextName();
            }

            Integer value = null;
            if (reader.hasNext() && (reader.peek() == JsonToken.NUMBER)) {
                value = reader.nextInt();
            }

            if (reader.hasNext() && (reader.peek() == JsonToken.END_OBJECT)) {
                reader.endObject();
            }

            if (name != null && value != null) {
                class6.getMap().put(name, value);
            }
        }
        return class6;
    }
}


在制定有关如何使用Exception的细节(很难找到)的过程中,我得到的TypeAdapter有助于参考了我的班级,但是在我将所有这些都弄清楚之后,我现在得到的Exception不再引用我的TypeAdapter,而是通常我对Gson#fromJson()的调用,其异常详细信息如下:

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 1241675 path $.class1.class2.class3[0].class4.class5[0].class6


我的#read()方法似乎在构建HashMap之后返回确定(实际用法中为33个项目),但是它在返回后立即停止运行。所以我知道我的TypeAdapter现在在尝试对我的特殊处理进行反序列化时让Gson搞砸了,但是我不确定如何,因为异常没有引用足以让我看的东西。

最佳答案

这就是我无法在GSON中找到有关TypeAdapters的良好信息的地方,以及我对API文档的审查不足。这行:

        if (reader.hasNext() && (reader.peek() == JsonToken.END_OBJECT)) {
            reader.endObject();
        }


无法返回true,因为到达对象末尾时hasNext()为false,因此永远不会调用reader.endObject()。我在while循环之后将被调用的对象移到了右边,它可以正常工作。

09-10 05:48
查看更多