Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JsonReader-读取数组时抛出预期的名称,但为NULL_Java_Android_Json_Parsing_Jsonreader - Fatal编程技术网

Java JsonReader-读取数组时抛出预期的名称,但为NULL

Java JsonReader-读取数组时抛出预期的名称,但为NULL,java,android,json,parsing,jsonreader,Java,Android,Json,Parsing,Jsonreader,我正在使用JsonReader解析一些JSON数据。这是一个结构相似的元素大数组: [ { "type":"duel", "discipline":"leagueoflegends", "tournament_id":"57ee13fe140ba0cd2a8b4593", "opponents":

我正在使用JsonReader解析一些JSON数据。这是一个结构相似的元素大数组:

[  
   {  
      "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;