Fastjson: JSONReader 遍历过程中, 只要中途break, 库的内部状态错乱....

Created on 23 Nov 2016  ·  6Comments  ·  Source: alibaba/fastjson

     reader = new JSONReader(new FileReader(metaJsonFile));
            reader.startObject();
            while (reader.hasNext()) {
                String key = reader.readString();
                String value = reader.readObject().toString();
                if ("version".equals(key)) {
                    result = Integer.valueOf(value );
                    break;   //  <----------------------------------------------------------------------here;
                }
                Logger.e(TAG, "key = " + key + ", value = " + value);
            }
            reader.endObject();   <----------------------------   exception 发生在这里,,  内部状态错乱..

异常信息:  

#getLocalVersonInfo
                                                               com.alibaba.fastjson.JSONException: syntax error, expect }, actual ,
                                                                   at com.alibaba.fastjson.parser.DefaultJSONParser.accept(DefaultJSONParser.java:1455)
                                                                   at com.alibaba.fastjson.JSONReader.endObject(JSONReader.java:76)
                                                                   at com.gzb.sdk.emoji.GzbEmojiModule.getLocalVersonInfo(GzbEmojiModule.java:105)
                                                                   at com.gzb.sdk.emoji.GzbEmojiModule.isNeedToUpdate(GzbEmojiModule.java:83)
                                                                   at com.gzb.sdk.emoji.GzbEmojiModule.extractInternalEmojisFilesToSdCard(GzbEmojiModule.java:74)
                                                                   at com.gzb.sdk.emoji.GzbEmojiModule.prepare(GzbEmojiModule.java:67)
                                                                   at com.jiahe.gzb.ui.activity.MainActivity$1.run(MainActivity.java:232)
                                                                   at java.lang.Thread.run(Thread.java:831)

question

All 6 comments

我为什么要break呢?

因为读完 "version" 这个key 就已经满足我的使用场景, 不必继续往下read了...

直接return不可以么?

@wenshao

谢谢您的解答,

这是Bug吗,今天首次使用fastJson,遇到该问题,和楼主一样break出现的问题,
既然break处已满足需求,为什么还得继续耗cpu跑下去呢?
我之所以不return是因为跳出while循环后可能还有很多其他逻辑进行,总不能全放在 break 处再直接retrun 吧...
能给说明一下或提供下解决break问题的方案吗,万分感谢~
@wenshao

不过直接return的话,不用关闭reader吗 ?

@whendream @PendyWan

不过直接return的话,不用关闭reader吗 ?

你可以用如下, 另外我用gson了, 反正我是做客户端的, 也不差这么点效率.
boolean needToDoOtherThing = false;
try {

     needToDoOtherThing = true;
     return ;   <-------------------------here

}
catch(){
}
finally {
reader.endObject(); // release stream res

  if(needToDoOtherThing) {
      //TODO : @PendyWan 做你想做的.
 }

}

Was this page helpful?
0 / 5 - 0 ratings

Related issues

viennadd picture viennadd  ·  3Comments

wongoo picture wongoo  ·  3Comments

wizardleeen picture wizardleeen  ·  4Comments

cddesire picture cddesire  ·  3Comments

ITcathyh picture ITcathyh  ·  3Comments