gpt4 book ai didi

java - 小部分 JSON 的自定义处理

转载 作者:太空宇宙 更新时间:2023-11-04 10:23:41 25 4
gpt4 key购买 nike

我有一个来自服务器的 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,a Long命名为str2等

实际需要的是Class6我有一个 map 或二维数组的类(哪个并不重要,但我的目标是 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 的详细信息时,它很有帮助地引用了我的类(class)。 (很难找到),但是在我解决了所有问题之后,我现在得到了 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条),但是返回后就吐了。所以我知道当 Gson 在我的特殊处理后尝试反序列化时,我的 TypeAdapter 现在正在搞乱 Gson,但我不确定如何,因为异常没有引用任何足够具体的内容供我查看。

最佳答案

这就是我无法在 GSON 中找到有关 TypeAdapters 的良好信息以及缺乏对 API 文档的审查的原因。这一行:

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

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

关于java - 小部分 JSON 的自定义处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50803791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com