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