gpt4 book ai didi

java - 使用 GSON 加载非常重的流

转载 作者:太空狗 更新时间:2023-10-29 16:05:21 25 4
gpt4 key购买 nike

我正在尝试读取一个非常庞大的 JSON(超过 6000 个对象)并将它们存储在 HashMap 中以便稍后将其插入到我的数据库中。

但问题是我遇到了 OOM,这是由我沉重的 JSON 造成的,但是 GSON 库应该让我摆脱这种情况,但事实并非如此!!!

有什么想法吗?

public Map<String,String> readJsonStream(InputStream in) throws IOException 
{
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
Map<String,String> contentMap = new HashMap<String,String>();

Gson mGson = new Gson();

contentMap = mGson.fromJson(reader, contentMap.getClass());

reader.close();

return contentMap;
}

最佳答案

根据我的经验,是的,您可以使用谷歌 GSON 来流式传输 JSON 数据,这是一个如何做到这一点的示例:

APIModel result = new APIModel();
try {
HttpResponse response;
HttpClient myClient = new DefaultHttpClient();
HttpPost myConnection = new HttpPost(APIParam.API_001_PRESENT(
serial_id, api_key));
try {
response = myClient.execute(myConnection);
Reader streamReader = new InputStreamReader(response
.getEntity().getContent());
JsonReader reader = new JsonReader(streamReader);
reader.beginObject();
while (reader.hasNext()) {

String name = reader.nextName();

if (name.equals("result")) {
if (reader.nextString() == "NG") {
result.setResult(Util.API_001_RESULT_NG);
break;
}
} else if (name.equals("items")) {
result = readItemsArray(reader);
} else {
reader.skipValue(); // avoid some unhandle events
}
}

reader.endObject();
reader.close();
} catch (Exception e) {
e.printStackTrace();
result.setResult(Util.API_001_RESULT_NG);
}
} catch (Exception e) {
e.printStackTrace();
result.setResult(Util.API_001_RESULT_NG);
}

readItemsArray 函数:

// read items array
private APIModel readItemsArray(JsonReader reader) throws IOException {
APIModel result = new APIModel();
String item_name, file_name, data;
result.setResult(Util.API_001_RESULT_OK);

reader.beginArray();
while (reader.hasNext()) {
item_name = "";
file_name = "";
data = "";
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
item_name = reader.nextString();
} else if (name.equals("file")) {
file_name = reader.nextString();
} else if (name.equals("data")) {
data = reader.nextString();
} else {
reader.skipValue();
}
}
reader.endObject();
result.populateModel("null", item_name, file_name, data);
}
reader.endArray();
return result;
}

API 模型类:

public class APIModel {
private int result;
private String error_title;
private String error_message;
private ArrayList<String> type;
private ArrayList<String> item_name;
private ArrayList<String> file_name;
private ArrayList<String> data;

public APIModel() {
result = -1;
error_title = "";
error_message = "";
setType(new ArrayList<String>());
setItem_name(new ArrayList<String>());
setFile_name(new ArrayList<String>());
setData(new ArrayList<String>());
}

public void populateModel(String type, String item_name, String file_name, String data) {
this.type.add(type);
this.item_name.add(item_name);
this.file_name.add(file_name);
this.data.add(data);
}

public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}

public String getError_title() {
return error_title;
}

public void setError_title(String error_title) {
this.error_title = error_title;
}

public String getError_message() {
return error_message;
}

public void setError_message(String error_message) {
this.error_message = error_message;
}

public ArrayList<String> getType() {
return type;
}

public void setType(ArrayList<String> type) {
this.type = type;
}

public ArrayList<String> getItem_name() {
return item_name;
}

public void setItem_name(ArrayList<String> item_name) {
this.item_name = item_name;
}

public ArrayList<String> getFile_name() {
return file_name;
}

public void setFile_name(ArrayList<String> file_name) {
this.file_name = file_name;
}

public ArrayList<String> getData() {
return data;
}

public void setData(ArrayList<String> data) {
this.data = data;
}


}

在我使用来自谷歌 GSON 的流式 API 之前,我也遇到了 OOM 错误,因为我得到的 JSON 数据非常大(许多图像和声音采用 Base64 编码),但是使用 GSON 流式我可以克服这个错误,因为它读取数据每个 token 不是一次全部。对于 Jackson JSON 库,我认为它也有流式 API 以及如何使用它几乎与我使用 google GSON 的实现相同。希望我的回答能对您有所帮助,如果您对我的回答还有其他疑问,请随时在评论中提问 :)

关于java - 使用 GSON 加载非常重的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902425/

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