Java JsonReader-读取数组时抛出预期的名称,但为NULL
我正在使用JsonReader解析一些JSON数据。这是一个结构相似的元素大数组:Java JsonReader-读取数组时抛出预期的名称,但为NULL,java,android,json,parsing,jsonreader,Java,Android,Json,Parsing,Jsonreader,我正在使用JsonReader解析一些JSON数据。这是一个结构相似的元素大数组: [ { "type":"duel", "discipline":"leagueoflegends", "tournament_id":"57ee13fe140ba0cd2a8b4593", "opponents":
[
{
"type":"duel",
"discipline":"leagueoflegends",
"tournament_id":"57ee13fe140ba0cd2a8b4593",
"opponents":[
{
"participant":null,
"forfeit":false,
"number":1,
"result":1,
"score":3
},
{
"participant":null,
"forfeit":false,
"number":2,
"result":3,
"score":2
}
],
"id":"58078b2770cb49c45b8b45bf",
"status":"completed",
"number":1,
"stage_number":1,
"group_number":1,
"round_number":1,
"date":"2016-10-01T05:00:00+0300",
"timezone":"Europe/Helsinki",
"match_format":null
},
...
]
这个数组中有数百个类似的元素。我只需要每个元素的一些数据,我编写的代码类似于:
public List readJsonStream(InputStream in)引发IOException{
JsonReader=新的JsonReader(新的InputStreamReader(在“UTF-8”中));
试一试{
返回readMatchesArray(读卡器);
}最后{
reader.close();
}
}
公共列表读取匹配阵列(JsonReader reader)引发IOException{
列表匹配项=新的ArrayList();
reader.beginArray();
while(reader.hasNext()){
添加(readMatch(reader));
}
reader.endArray();
返回比赛;
}
公共匹配readMatch(JsonReader reader)引发IOException{
字符串状态=null,日期=null,时间=null;
匹配。括号=空;
int id=-1,round=-1;
匹配。团队1=null,团队2=null;
reader.beginObject();
while(reader.hasNext()){
字符串名称=reader.nextName();
交换机(名称){
案例“编号”:
id=reader.nextInt();
打破
案例“状态”:
status=reader.nextString().toUpperCase();
打破
案例“组号”:
if(reader.nextInt()==1){
括号=优胜者;
}else if(reader.nextInt()==2){
括号=输家;
}
打破
案例“轮号”:
round=reader.nextInt();
打破
案件“日期”:
试一试{
字符串tempDateRaw=reader.nextString();
字符串[]tempDate=tempDateRaw.split(“T”);
字符串[]TENTIME=tempDate[1]。拆分(“:”);
日期=临时日期[0];
时间=试探时间[0]+:“+试探时间[1];
}捕获(非法状态){
日期=空;
时间=零;
}
打破
“反对者”一案:
int计数器=0;
reader.beginArray();
while(reader.hasNext()){
如果(计数器==0){
team1=readTeam(读卡器);
}否则{
team2=readTeam(读卡器);
}
计数器++;
}
reader.endArray();
打破
违约:
reader.skipValue();
打破
}
}
reader.endObject();
返回新的匹配项(团队1、团队2、id、回合、括号、状态、日期、时间);
}
public Match.Team readTeam(JsonReader reader)抛出IOException{
字符串teamName=null;
积分=-1;
布尔赢家=假;
reader.beginObject();
while(reader.hasNext()){
String name=reader.nextName();//这就是发生错误的地方
交换机(名称){
案例“参与者”:
if(reader.peek()!=JsonToken.NULL){
teamName=reader.nextString();
}
否则{
teamName=null;
}
打破
案例“得分”:
if(reader.peek()!=JsonToken.NULL){
score=reader.nextInt();
}
否则{
得分=-1;
}
打破
案例“结果”:
if(reader.peek()!=JsonToken.NULL){
winner=reader.nextInt()==1;
}
否则{
胜利者=假;
}
打破
违约:
reader.skipValue();
打破
}
}
reader.endObject();
返回新的比赛团队(队名、分数、获胜者);
}
然而,当我试图解析对手数组时,我在readTeam()中出现了一个错误,需要一个名称,但却是NULL,我很困惑为什么会发生这种情况
起初我不知道peek()的用法,所以在readMatch()方法中我使用了try/catch,我必须改变它,但它应该与问题无关。我找不到关于这个特定错误的任何信息,有很多关于其他类似错误的主题(预期名称为string/int/whatever),但在这里我找不到它不起作用的原因。你有什么办法解决它吗?好吧,我找到了一个解决方案,就像我想的,比我想象的要简单。基本上,当我检查空值时,如下所示:
if(reader.peek() != JsonToken.NULL) {
teamName = reader.nextString();
}
else {
teamName = null;
}
所谓的“阅读器光标”不会移动,因此它基本上停留在teamName的值上(在本例中)。因此,最简单的解决方案就是将
reader.skipValue()放进去代码>在else
块中。我还在我的代码中发现了另一个bug,在案例“group\u number”
中,我实际移动了前面提到的“游标”两次,但解决方案是显而易见的。希望它能对某人有所帮助。您也应该使用null
令牌,调用nextNull()
或skipValue()
,否则Reader
将无法前进并坚持使用null
。例如:
case "result":
if(reader.peek() != JsonToken.NULL) {
winner = reader.nextInt() == 1;
} else {
winner = false;
reader.nextNull(); // note on this
}
break;
可以使用nextNull()或skipValue()使用空文本
您不使用GSON
解析JSON
有什么原因吗?嗯,不太可能。我仍然是Java的初学者和Android的新手,这是我在解析JSON时看到的第一件事。以前我只是使用StringBuilder和getJSONObject(),但由于文件太大,内存不足。我想我可以试试格森
case "result":
if(reader.peek() != JsonToken.NULL) {
winner = reader.nextInt() == 1;
} else {
winner = false;
reader.nextNull(); // note on this
}
break;