我有一个来自服务器的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,但我不确定如何,因为异常没有引用任何特定的东西供我查看。
答案 0 :(得分:0)
这是我无法在GSON中找到关于TypeAdapter的良好信息的地方,以及我对API文档缺乏审查。这一行:
if (reader.hasNext() && (reader.peek() == JsonToken.END_OBJECT)) {
reader.endObject();
}
无法返回true,因为当到达对象的末尾时hasNext()
为false,因此永远不会调用reader.endObject()
。我将被调用的对象移到while
循环后的对象上,然后就可以了。