gpt4 book ai didi

java - Java中巨大的Json字符串转义的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-02 09:51:37 25 4
gpt4 key购买 nike

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

我的 Json 字符串看起来像,所有字符串都是一行。所以我无法逐行读取,因为 OOM(内存不足)

{"Tag":"[{\"mySubTag\":\"myValue\/myValue\"},{\"mySubTag\":\"myValueWithAnotherEscapedStringInside\\xyz\/likeThis\"},...]"}

通常,我使用 JsonObject 中的标签作为字符串提取它们,然后从“Tag”属性中获取字符串值,并再次使用该字符串创建新的 JsonArray,因此它不会自动从 JsonArray 类中转义,但 Android 不允许放置巨大的值Json 文件(或字符串)写入内存。我尝试通过流式传输来删除反斜杠,但如果 subTag 值内部有转义字符,则它不是正确的转义方法。

我的问题是什么是完成这项工作的最佳且性能友好的方式?

(注意:抱歉英语不好)

更新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;

}
}

我的输出是:

Tag
69387276
BEGIN_ARRAY
BEGIN_OBJECT
name: mySubTag
String: myValue/myValue

我很困惑为什么数组的其余元素被忽略!

更新2:

经过一些调试过程后,我意识到 hasNext() 方法返回“如果当前数组或对象有另一个元素,则返回 true”。但当前不是后面的元素,所以我更新了 while 循环,如下所示:

while (jsonReader1.peek()!=JsonToken.END_DOCUMENT) {
JsonToken token = jsonReader1.peek();
switch(token){
...
}
}

最佳答案

@pskink 推荐 android.util.JsonReader 在使用这个库编写代码后解决了我的问题。要查看我的代码,请参阅我的相关更新。

谢谢@pskink。

关于java - Java中巨大的Json字符串转义的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56281505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com