gpt4 book ai didi

java - Gson 被读入 LinkedTreeMap

转载 作者:行者123 更新时间:2023-11-30 02:42:59 24 4
gpt4 key购买 nike

我在序列化 JSON 数据时遇到问题。

所以,我尝试使用泛型,但不知何故,当我尝试实现它时,Gson 讨厌我。我想做的就是对泛型进行基本抽象。这是我的代码:

执行泛型部分的主类:

package com.yasinyazici.riot.config.json;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.Map;

public abstract class JsonDataParser<T> {
protected Gson gson = new Gson();
protected String json;

public JsonDataParser(String json) {
this.json = json;
}

protected Map<String, T> transform() {
Type type = new TypeToken<Map<String, T>>(){}.getType();
return gson.fromJson(json, type);
}

public abstract T get();
}

这是主类的子级:

package com.yasinyazici.riot.config.json.impl;

import com.yasinyazici.riot.config.json.JsonDataParser;
import com.yasinyazici.riot.data.summoner.SummonerProperties;

public class SummonerPropertiesParser extends JsonDataParser<SummonerProperties> {
public SummonerPropertiesParser(String json) {
super(json);
}

@Override
public SummonerProperties get() {
transform().entrySet().forEach(p -> System.out.println(p.getValue().getProfileIconId()));
return null;
}
}

如您所见,IntelliJ 甚至将 #get() 识别为“SummonerProperties”。

这是我的错误:

Exception in thread "main" java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.yasinyazici.riot.data.summoner.SummonerProperties
at com.yasinyazici.riot.config.json.impl.SummonerPropertiesParser.lambda$get$0(SummonerPropertiesParser.java:17)
at java.lang.Iterable.forEach(Iterable.java:75)
at com.yasinyazici.riot.config.json.impl.SummonerPropertiesParser.get(SummonerPropertiesParser.java:17)
at com.yasinyazici.riot.Main.main(Main.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

我有点困惑。如果我打印 p (对象本身),我会得到一些奇怪格式的 json

jungleíslife={id=8.2249757E7, name=Jungle ís Life, profileIconId=1339.0, summonerLevel=30.0, revisionDate=1.481558959E12}

原始 json 如下所示:

{"jungleíslife":{"id":82249757,"name":"Jungle ís Life","profileIconId":1339,"summonerLevel":30,"revisionDate":1481558959000}}

p#getValue() 打印 json 的正文。 (以奇怪的格式)

所以看起来有些东西没有被正确解析。

有人吗?将不胜感激任何类型的帮助/解决方案。

编辑:这不是完全重复,原因是我没有尝试参数化任何类型,而是需要获取原始类型(我没有使用任何类变量来访问类字段进行解析,我也不想)。

EDIT2: 好吧,好吧。呃,我尝试了选项 1 的示例(请参阅链接问题作为引用),但我得到以下结果(注意,我在 ListParameterizedType 类中创建了方法 #getRawType() 返回 Map.class):

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

即使我让它返回 ArrayList,它也会抛出这个:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

编辑:仍然有问题..

编辑2:没有人有可能的解决方案..?

最佳答案

您必须在子类中构造 TypeToken,其中提供了具体类型信息。向您的父类(super class)添加一个抽象方法:

protected abstract Type getType();

更改解析方法以使用它:

protected Map<String, T> transform() {
return gson.fromJson(json, getType());
}

然后在子类中重写getType以返回具体类型:

@Override
protected Type getType() {
return new TypeToken<Map<String, SummonerProperties>>(){}.getType();
}

不相关,但打印 getValue() 时看到的“奇怪格式”不是 json,它来自 Object.toString()

关于java - Gson 被读入 LinkedTreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41105471/

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