如何从URL逐行读取大型json文件。我的json文件必须通过http从url中读取。一旦我读了网址,打开网址流,我必须逐行阅读。它是一个json格式的文件。请帮忙。 我试图从网址读取如下:
InputStream is = new URL(url).openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, Charset.forName("UTF-8")));
String line, results = "";
while ((line = reader.readLine()) != null) {
results += line;
}
reader.close();
is.close();
JSONObject json = new JSONObject(results);
JSONArray fileArray = json.getJSONArray("Documents");
然后我再次为每一行循环播放数组。这里有一些改进代码的建议。
答案 0 :(得分:2)
根据您对该问题的评论:
我有一个名为Documents的json数组。然后在这个数组里面我有多行,每行有对象Action和Filenames(指向其他文件的位置,这些是html格式)。基本上我想逐行阅读这个json文件并单独处理这个动作和文件名。因为每行的动作和文件名都不同。
我认为你正在使用的格式是这样的:
{"Documents":[
{"Action":"action 1", "Filenames":["file 1a", "file 1b"]},
{"Action":"action 2", "Filenames":["file 2a", "file 2b"]},
// and so on for thousands more array entries
]}
不是一次尝试加载整个顶级JSON对象,而是使用某种流API并一次处理一个“行”更有意义。例如,使用Gson,您可以使用JsonReader
API执行此类操作:
InputStream is = new URL(url).openStream();
BufferedReader r = new BufferedReader(new InputStreamReader(
is, Charset.forName("UTF-8")));
JsonReader reader = new JsonReader(r);
JsonParser parser = new JsonParser();
reader.beginObject(); // the initial '{'
String name = reader.nextName();
assert "Documents".equals(name);
reader.beginArray(); // the opening '[' of the Documents array
while(reader.hasNext()) {
JsonObject doc = parser.parse(reader).getAsJsonObject();
String action = doc.get("Action").getAsString();
JsonArray filenames = doc.getAsJsonArray("Filenames");
// do something with the document here
// ...
}
reader.endArray(); // ending ']' of Documents
reader.endObject(); // final '}'
reader.close();
这样你一次只需要在内存中保留一个“行”。
其他JSON库中也有类似的API,虽然有些API比其他JSON库更加繁琐(例如,使用json.org JSONTokener
,您必须自己处理:
和,
分隔符明确地)。
答案 1 :(得分:0)
以下是我用来从URL读取JSON的内容:
public static String readJsonFromUrl(String url) throws IOException
{
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(
new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
return jsonText;
} finally {
is.close();
}
return "";
}
private static String readAll(Reader rd) throws IOException
{
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}