在Java中,最大的Json字符串unescape的最佳方法是什么

在Java中,最大的Json字符串unescape的最佳方法是什么,java,android,json,Java,Android,Json,我有一个Android应用程序项目,可以下载巨大的Json字符串,并提取程序需求的有用信息。但是这个文件非常大,几乎100mb,所以我需要读它的小部分 我的Json字符串看起来像,所有字符串都是一行。所以我无法逐行阅读,因为我的记忆太少了 {"Tag":"[{\"mySubTag\":\"myValue\/myValue\"},{\"mySubTag\":\"myValueWithAnotherEscapedStringInside\\xyz\/likeThis\"},...]"} 通常,我使

我有一个Android应用程序项目,可以下载巨大的Json字符串,并提取程序需求的有用信息。但是这个文件非常大,几乎100mb,所以我需要读它的小部分

我的Json字符串看起来像,所有字符串都是一行。所以我无法逐行阅读,因为我的记忆太少了

{"Tag":"[{\"mySubTag\":\"myValue\/myValue\"},{\"mySubTag\":\"myValueWithAnotherEscapedStringInside\\xyz\/likeThis\"},...]"}
通常,我使用JsonObject中的tag作为字符串来提取它们,然后从tag属性中获取字符串值,并再次使用此字符串创建新的JsonArray,因此它会自动从JsonArray类中取消替换,但Android不允许将巨大的Json文件或字符串放入内存。我试图通过流式传输删除反斜杠,但如果子标记值中有转义字符,则这不是正确的unescape方法

我的问题是,做这项工作的最佳方式是什么

注意:抱歉英语不好

更新1:

在@pskink推荐之后,我使用了android.util.JsonReader,并编写了类似这样的代码:

JsonReader jsonReader = new JsonReader(new FileReader(f));//f is defined previous code but not shown!
jsonReader.beginObject();                   
String name = jsonReader.nextName();        
String value = jsonReader.nextString();         
Log.d(AppConstants.TAG, "name: " + name);   
Log.d(AppConstants.TAG, "value: " + value.length());//value is so big I only care about its length
JsonReader jsonReader1 = new JsonReader(new StringReader(value));
while (jsonReader1.hasNext()) {
    JsonToken token = jsonReader1.peek();
    switch (token) {
        case BEGIN_ARRAY:
            jsonReader1.beginArray();
            Log.d(AppConstants.TAG, "BEGIN_ARRAY");
            continue;
        case END_ARRAY:
            jsonReader1.endArray();
            Log.d(AppConstants.TAG, "END_ARRAY");
            continue;
        case BEGIN_OBJECT:
            jsonReader1.beginObject();
            Log.d(AppConstants.TAG, "BEGIN_OBJECT");
            continue;
        case END_OBJECT:
            jsonReader1.endObject();
            Log.d(AppConstants.TAG, "END_OBJECT");
            continue;
        case NAME:
            Log.d(AppConstants.TAG, "name: " + jsonReader1.nextName());
            continue;
        case STRING:
            Log.d(AppConstants.TAG, "String: " + jsonReader1.nextString());
            continue;
        case NUMBER:
            Log.d(AppConstants.TAG, "number: " + jsonReader1.nextString());
            continue;
        case BOOLEAN:
            Log.d(AppConstants.TAG, "boolean: " + jsonReader1.nextBoolean());
            continue;
        case NULL:
            jsonReader1.nextNull();
            continue;
        case END_DOCUMENT:
            Log.d(AppConstants.TAG, "END_DOCUMENT");
            break;

    }
}
我得到的结果是:

我弄不明白为什么数组的其余元素被忽略了

更新2:

经过一些调试过程后,我意识到如果当前数组或对象有另一个元素,hasNext方法将返回true。但当前不是更晚的元素,所以我在循环时更新如下:

while (jsonReader1.peek()!=JsonToken.END_DOCUMENT) {
    JsonToken token = jsonReader1.peek();
    switch(token){
    ...
    }
}
@pskink推荐android.util.JsonReader在使用该库编写代码后解决了我的问题。要查看我的代码,请查看我的更新


谢谢@pskink。

请参阅android.util。JsonReader@pskink我已将我的问题更新为官方问题documentation@pskink谢谢你的推荐,问题解决了。但是我仍然对为什么这行字符串value=jsonReader.nextString;抛出内存不足异常,但重要的是它能正常工作。
while (jsonReader1.peek()!=JsonToken.END_DOCUMENT) {
    JsonToken token = jsonReader1.peek();
    switch(token){
    ...
    }
}