Java GSON反序列化:嵌套JSon文件错误

Java GSON反序列化:嵌套JSon文件错误,java,json,gson,Java,Json,Gson,我试图解析JSon文件,但我无法找出我的错误(较小的示例可以完美地工作) Song.json { "song": { "fileInfo": { "version": "0.1", "createdIn": "PickWorks Studio", "modifiedIn": "PickWorks Studio", "modified": "2010-01-28T13:15:30

我试图解析JSon文件,但我无法找出我的错误(较小的示例可以完美地工作)

Song.json

{
    "song": {
        "fileInfo": {
            "version": "0.1",
            "createdIn": "PickWorks Studio",
            "modifiedIn": "PickWorks Studio",
            "modified": "2010-01-28T13:15:30+01:00"
        },
        "properties": {
            "authors": [
                {
                    "name": "Juri Traktori",
                    "type": "music",
                    "lang": "en"
                }
            ],
            "titles": [
                {
                    "title": "Rainy day",
                    "lang": "en",
                    "original": true
                },
                {
                    "title": "Descowe dni",
                    "lang": "pl"
                }
            ],
            "copywright": "Michal Tomanek",
            "released": "19-03-1993",
            "transposition": -3,
            "tempo": {
                "type": "text/bpm",
                "value": "moderate/90"
            },
            "key": "A",
            "version": 0.99,
            "publisher": "myself",
            "keywords": [ "grace", "words","amazing"],
            "verseOrder": "v1 v2 v1 v1 v2",
            "themes": [
                {
                    "theme": "adoration"
                }
            ]
        },
        "lyrics": [
            {
                "section": "v1",
                "lines": [
                    {
                        "lang": "en",
                        "part": "man",
                        "text": "How <chord name=\"A\"/>great is <br/>your love",
                        "comment": "Sing softly"
                    },
                    {
                        "lang": "en",
                        "part": "woman",
                        "text": "How great is your love to us"
                    }
                ]
            }
        ]
    }
}
它崩溃了。。。我坚持了好几天,没能把它做好

顺便说一句:这是我关于SO的第一个问题,所以如果它没有按应有的方式呈现,请原谅

编辑:

编辑2:

import java.util.List;

public class SongType {
    public static Song song;

    public class Song {
        public FileInfo     fileInfo;
        public Properties   properties;
        public List<Lyrics> lyrics;

        public FileInfo getFileInfo()     {return fileInfo;}
        public Properties getProperties() {return properties;}
        public List<Lyrics> getLyrics()   {return lyrics;}

        public void setFileInfo(FileInfo fileInfo)       {this.fileInfo   = fileInfo;}
        public void setProperties(Properties properties) {this.properties = properties;}
        public void setLyrics(List<Lyrics> lyrics)       {this.lyrics     = lyrics;}
    } 
//code continues here ...
1) 这首歌现在是静止的 2) 歌词在列表中(里面有更多的部分)

编辑3:

import java.util.List;

public class SongType {
    public static Song song;

    public class Song {
        public FileInfo     fileInfo;
        public Properties   properties;
        public List<Lyrics> lyrics;

        public FileInfo getFileInfo()     {return fileInfo;}
        public Properties getProperties() {return properties;}
        public List<Lyrics> getLyrics()   {return lyrics;}

        public void setFileInfo(FileInfo fileInfo)       {this.fileInfo   = fileInfo;}
        public void setProperties(Properties properties) {this.properties = properties;}
        public void setLyrics(List<Lyrics> lyrics)       {this.lyrics     = lyrics;}
    } 
//code continues here ...
import java.util.List;
公共类歌曲类型{
公共静态歌曲;
公开课歌曲{
公共文件信息文件信息;
公共财产;
公开名单歌词;
public FileInfo getFileInfo(){return FileInfo;}
公共属性getProperties(){return Properties;}
公共列表GetLyps(){返回歌词;}
public void setFileInfo(FileInfo FileInfo){this.FileInfo=FileInfo;}
public void setProperties(Properties属性){this.Properties=Properties;}
public void setlyris(列出歌词){this.lyris=lyris;}
} 
//代码在这里继续。。。

但它仍然不起作用…我是否遗漏了其他内容?

您在
歌词
字段中遇到问题,Gson需要一个对象,但您提供了一个数组(仅包含一个对象)

这是你的班级:

 public class Song {
                public FileInfo   fileInfo;
                public Properties properties;
                public Lyrics    lyrics;
                // more rows
这是JSON中无与伦比的部分

 "lyrics": [
      //more things here      
  ]
如您所见,使用方括号,新数组开始

若要解决此问题,请将
歌词
字段更改为
列表
,否则,如果可以,请更改JSON,删除方括号。当然,您还必须更改
歌词
字段的getter和setter。在代码术语中,更改如下:

 public static class Song {
      public FileInfo   fileInfo;
      public Properties properties;
      public List<Lyrics>    lyrics;

      public FileInfo getFileInfo()     {return fileInfo;}
      public Properties getProperties() {return properties;}
      public List<Lyrics> getLyrics()                 {return lyrics;}

      public void setFileInfo(FileInfo fileInfo)               {this.fileInfo   = fileInfo;}
      public void setProperties(Properties properties) {this.properties = properties;}
      public void setLyrics(List<Lyrics> lyrics)                     {this.lyrics     = lyrics;}
 }
因此:

How <chord name="A"/>great is <br/>your love
你的爱有多伟大

这里有几个问题

  • 歌词是JSON文件中的数组,但变量不是。请将其更改为
    List
  • 内部类
    Song
    不是静态的,这可能是一个问题(尽管这显然对您有用):

  • 你能把错误信息放在帖子里吗?否则很难知道要查找什么。请添加异常的堆栈跟踪以及它是如何崩溃的。你可以通过问题下面的
    编辑
    链接来完成。它不能反序列化类的哪个字段?我不知道它在哪里崩溃。。。(我提供了强大的C/C++背景,只使用了2周的Java—调试仍然存在问题)关于edit3,您是否有其他异常?如果有,发布它。需要其他信息,您是解析与问题相同的JSON还是另一个JSON?在原始文件中,歌词中包含多个对象…将其更改为List,但错误仍然相同…在您提供的示例中,有一个数组,其中只有一个歌词。无论如何,请使用ly列表rics@user1741772:如果你使用一个列表并相应地设置它们的getter和setter,它就会工作。我在本地用
    GSON
    Jackson
    映射器(这是一个做同样事情的库)对它进行了测试,谢谢@RaulRene的确认
        Gson gson = new Gson() ;
        SongType parsed = gson.fromJson(s, SongType.class);
        System.out.print(parsed.song.getLyrics().get(0).getLines().get(0).getText());
    
    How <chord name="A"/>great is <br/>your love