如何将json数组解析为json流

时间:2018-01-26 17:19:07

标签: java json

我有一个约30mb jsonFileInputStream.json的json文件。

 [ 
        ["aaa", "kkk", "1674"],
        ["bbb", "jjj", "1673"],
        ["ccc", "qqq", "1677"],

                  ..... // very long stream of data

        ["ddd", "zzz", "1677"]]

这是一个非常长的流,我无法存储为对象。 我见过以下问题,但它存储为对象,我不能这样做。

Java: parse Array of Arrays from JSON

while循环给出错误:

  

引起:java.lang.IllegalStateException:预期END_ARRAY但在第1行是BEGIN_ARRAY ....

我有以下代码,如果第一个字符串在任何数组中都不匹配,我会收到错误。

try {
            JsonReader reader = new JsonReader(new InputStreamReader(jsonFileInputStream, "UTF-8"));
            Gson gson = gsonBuilder.create();
            reader.beginArray();

            reader.beginArray();
            while (reader.hasNext()) {
                String abc = reader.nextString();
               // check first string with input string
               // it checks for matching string in json stream.
                if (barCode.equals(abc) ) {
                    String name2 = reader.nextString();
                    String name3 = reader.nextString();



                    boolean found = true;
                    break;
                } else {

                    reader.nextString();
                    reader.nextString();

                    reader.endArray();
                    reader.beginArray();

                }
            }
            reader.endArray();
            reader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

我的错误堆栈跟踪如下所示:

java.lang.IllegalStateException: Expected END_ARRAY but was BEGIN_ARRAY at line 1 column 218 path $[1]

                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2724)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2789)
                  at android.app.ActivityThread.-wrap12(ActivityThread.java)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1527)
                  at android.os.Handler.dispatchMessage(Handler.java:110)
                  at android.os.Looper.loop(Looper.java:203)
                  at android.app.ActivityThread.main(ActivityThread.java:6251)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1075)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
                   Caused by: java.lang.IllegalStateException: Expected END_ARRAY but was BEGIN_ARRAY at line 1 column 218 path $[1]
                  at com.google.gson.stream.JsonReader.endArray(JsonReader.java:368)
                  at com.android.features.home.TestActivity.readBarcodeFromMainDb(TestActivity)

1 个答案:

答案 0 :(得分:0)

我认为当条件

时会出现问题
barCode.equals(aaa)

永远不会满足。当你进入else分支时会发生以下情况:

["bbb", "jjj", "1673"],
["ccc", "qqq", "1677"],
你读得像:

...
reader.endArray();
reader.beginArray();

所以经过"]"你打电话给reader.endArray() 然后你就调用reader.beginArray() 因为你期待下一个阵列。

如果你进入文件末尾的else语句,你将在json文件的末尾结束:

["ddd", "zzz", "1677"]]

在第一次"]"之后你找到另一个"]"并且堆栈跟踪正好告诉你:

  

预计END_ARRAY但第1行是BEGIN_ARRAY

因此,您需要确保处理if语句中的条件永远不会为真的情况。

另外,你正在阅读

String abc = reader.nextString();

但是你没有在if语句中使用abc变量。我不确定这是你想要的。究竟是什么" barCode"变量在这里吗?

无论如何,要解决问题,只需更改代码如下:

        ...
        Gson gson = gsonBuilder.create();
        reader.beginArray();

        while (reader.hasNext()) {
            reader.beginArray();  //Moved this statement from outside the while to here
            String abc = reader.nextString();
            if (abc.equals(aaa) ) {
                String name2 = reader.nextString();
                String name3 = reader.nextString();



                boolean found = true;
                break;
            } else {

                reader.nextString();
                reader.nextString();

                reader.endArray();
                //Remove the reader.beginArray() from here


            }
        }