Java GSON反序列化:嵌套JSon文件错误
我试图解析JSon文件,但我无法找出我的错误(较小的示例可以完美地工作) Song.jsonJava 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
{
"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
你的爱有多伟大
这里有几个问题
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