就像标题所说的,我试图解析一个对象,该对象的关键是一个动态的String。我看了很长一段时间了一些答案,发现1 this,2 this和3 this通过gson解析具有动态密钥的对象
为了您的信息,我还挺新到Java,这是我第一次用JSON数据工作,并解析
JSON响应看起来像这样:
{"Narcos": {"episodes": [{"season": 2, "name": "Episode #2.1", "number": 1}, {"season": 2, "name": "Episode #2.10", "number": 10}, {"season": 2, "name": "Episode #2.2", "number": 2}, {"season": 2, "name": "Episode #2.3", "number": 3}, {"season": 2, "name": "Episode #2.4", "number": 4}, {"season": 2, "name": "Episode #2.5", "number": 5}, {"season": 2, "name": "Episode #2.6", "number": 6}, {"season": 2, "name": "Episode #2.7", "number": 7}, {"season": 2, "name": "Episode #2.8", "number": 8}, {"season": 2, "name": "Episode #2.9", "number": 9}, {"season": 1, "name": "Descenso", "number": 1}, {"season": 1, "name": "Despegue", "number": 10}, {"season": 1, "name": "Explosivos", "number": 6}, {"season": 1, "name": "La Catedral", "number": 9}, {"season": 1, "name": "La Gran Mentira", "number": 8}, {"season": 1, "name": "The Men of Always", "number": 3}, {"season": 1, "name": "The Palace in Flames", "number": 4}, {"season": 1, "name": "The Sword of Sim\u00f3n Bolivar", "number": 2}, {"season": 1, "name": "There Will Be a Future", "number": 5}, {"season": 1, "name": "You Will Cry Tears of Blood", "number": 7}], "year": 2015}}
动态键,在该示例中 “Narcos”。它基本上是你想要的剧集名称。
我尝试了不同的方法。 对于第一个链接,用于解析的代码如下所示:
ApiTest.class
Type mapType = new TypeToken<Map<String, Serie> >() {}.getType(); // define generic type
Map<String, Serie> serie = gson.fromJson(jsonString, mapType);
Serie.class
public class Serie {
private Episodes episodes;
Episodes.class
public class Episodes {
private Episode[] episode;
private int year;
插曲。类
public class Episode {
private int season;
private String name;
private int number;
当我用第一种方法去,我得到这个错误
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 41 path $..episodes
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:187)
at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145)
at com.google.gson.Gson.fromJson(Gson.java:887)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at testing.ApiTest.main(ApiTest.java:114)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 41 path $..episodes
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
... 9 more
当我试图根据其他两个线程来解析数据,我创建了一个响应类是这样的:
PoroResponse.class
public class PoroResponse {
private Map<String, Serie> serie;
,并改变了代码ApiTest.class到:
PoroResponse poro = gson.fromJson(jsonString, PoroResponse.class);
,并试图获得一个数组通过这个一起工作:
Episode[] episodes = poro.get(poro).getSerie().getEpisodes().getEpisode();
我也试图解析它是这样的:
Object o = new Gson().fromJson(json, Object.class);
但在双方的最后情况下,不是我的意甲对象是NULL或我得到一个LinkedTreeMap与NULL值。
难道有人指着我正确的方向吗?自2天以来,我一直被困在这个问题上,诚实地没有真正的想法如何解决它。
感谢您的意见。我应该补充说Narcos是动态的关键。它根据对API的请求而改变。所以它总是你要求的节目的名字。 这是API的URL,如果它可能有帮助。 我将编辑我的问题,使其更清楚一点。 – Tagman
@Tagman我编辑了我的答案。请看看 – user3662708
非常感谢。这正是我所期待的。我仍然在试图弄清为什么我只需要这两个班。但代码就像我想要的那样工作。 – Tagman