自由处理小部分JSON

时间:2018-06-11 18:14:35

标签: java json gson

我有一个来自服务器的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类,其中Long名为str1,Long名为str2,等等。

实际需要的是Class6类,其中我有一个地图或二维数组(并不重要,但我的目标是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个项目)后返回正常,但在返回后立即barfs。所以我知道我的TypeAdapter在我特殊处理后尝试反序列化时会弄乱Gson,但我不确定如何,因为异常没有引用任何特定的东西供我查看。

1 个答案:

答案 0 :(得分:0)

这是我无法在GSON中找到关于TypeAdapter的良好信息的地方,以及我对API文档缺乏审查。这一行:

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

无法返回true,因为当到达对象的末尾时hasNext()为false,因此永远不会调用reader.endObject()。我将被调用的对象移到while循环后的对象上,然后就可以了。