使用 GSON 将 JSON 反序列化为 Java 对象时遇到问题

Posted

技术标签:

【中文标题】使用 GSON 将 JSON 反序列化为 Java 对象时遇到问题【英文标题】:Trouble deserializing JSON into Java objects with GSON 【发布时间】:2021-12-13 16:17:05 【问题描述】:

我一直在努力学习 GSON,但我一直在努力学习。我正在尝试使用 GSON 将 JSON 文件反序列化为 Java 对象。我已经阅读了这里的一百万个其他问题,对于我的生活,我无法理解我做错了什么。

这是我的 JSON 文本:


 "movies": [
  
   "name": "The Shawshank Redemption",
   "url": "https://parsehub.com/sandbox/moviedetails?movie=The%20Shawshank%20Redemption",
   "IMAX": "06:00 PM",
   "rating": "9 . 2",
   "cast": [
    
     "character": "Andy Dufresne",
     "actor": "Tim Robbins"
    ,
    
     "character": "Ellis Boyd 'Red' Redding",
     "actor": "Morgan Freeman"
    ,
    
     "character": "Warden Norton",
     "actor": "Bob Gunton"
    ,
    
     "character": "Heywood",
     "actor": "William Sadler"
    
   ]
  ,
  
   "name": "Schindler's List",
   "url": "https://parsehub.com/sandbox/moviedetails?movie=Schindler%27s%20List",
   "IMAX": "06:15 PM",
   "rating": "8 . 9",
   "cast": [
    
     "character": "Oskar Schindler",
     "actor": "Liam Neeson"
    ,
    
     "character": "Itzhak Stern",
     "actor": "Ben Kingsley"
    ,
    
     "character": "Amon Goeth",
     "actor": "Ralph Fiennes"
    
   ]
  
 ]

这是我的 Java 代码:

import com.google.gson.Gson;
import java.io.*;
import java.lang.reflect.Type;
import java.util.ArrayList;

public class Main 

    public static void main(String[] args) throws FileNotFoundException 
        Gson gson = new Gson();
        Movies[] movies = gson.fromJson(new FileReader("src/main/input.json"), (Type) Movies.class);
        System.out.println(movies[0]);
    

    class Movies 
        String name;
        String url;
        String IMAX;
        String rating;
        ArrayList<Cast> cast;
    

    class Cast 
        ArrayList<CastMember> castMembers;
    

    class CastMember
        String character;
        String actor;
    

当我运行它时,我收到以下错误:

Exception in thread "main" java.lang.ClassCastException: class com.Main$Movies cannot be cast to class [Lcom.Main$Movies; (com.Main$Movies and [Lcom.Main$Movies; are in unnamed module of loader 'app')
    at com.Main.main(Main.java:13)

【问题讨论】:

我认为问题在于您将类型指定为单个 Movies.class,这与您的电影数组(它是一个数组)的类型不同。我不熟悉 GSON 库,所以帮不上什么忙,但是如果您可以将类型指定为 Movies[].class 或类似的东西,那可能会起作用。 如果我尝试将 Movies.class 更改为 Movies[].class,我会收到以下错误:“java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $”跨度> 啊。创建一个 MovieList 类,它上面只有一个 Movie 对象列表。然后使用 MovieList.class 作为类型。您正在解析的 JSON 是一个包含电影数组的对象,因此您的 Java 对象需要反映这一点。 【参考方案1】:

您要反序列化的 JSON 表示一个带有对象列表的对象。您尝试反序列化的 Java 对象需要与之匹配。

首先,新建一个类MovieList

class MovieList 
     List<Movie> movies;

Movies 类更新为Movie,因为它代表一部电影。

class Movie 
     String name;
     String url;
     String IMAX;
     String rating;
     List<Cast> cast;

现在尝试使用以下代码调用gson.fromJson(...)

MovieList movieList = gson.fromJson(new FileReader("src/main/input.json"), MovieList.class);
System.out.println(movieList.getMovies().get(0));

【讨论】:

这个解决方案现在看起来很明显,我看到了!非常感谢!问题解决了!【参考方案2】:

试试这个

Gson gson = new Gson();
Movies[] movies = gson.fromJson(new JsonReader(new FileReader("src/main/input.json"))),Movies[].class);

或类似的东西

Type listType = new TypeToken<List<Movies>>() .getType();
List<Movies> movies = new Gson().fromJson(new JsonReader(new FileReader("src/main/input.json"))), listType);

【讨论】:

以上是关于使用 GSON 将 JSON 反序列化为 Java 对象时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将java对象序列化/反序列化为javax.JSON

如何通过 gson 将 json 反序列化为嵌套的自定义地图?

Google Gson 使用简介

让我们畅通无阻:在 Scala 中使用 GSON 读取 Json

Gson 在反序列化对象时忽略 null

Gson 将 List<String> 反序列化为 realmList<RealmString>