我有一个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
循环之后将被调用的对象移到了右边,它可以正常工作。