您好,我正在创建我的第一个Android应用程序,我想知道什么是从URL解析JSON Feed的最佳和最有效的方法。也理想我想将它存储在某处,以便我可以继续在应用程序的不同部分回到它。我到处寻找,发现了许多不同的方法,我不知道该去哪。在您看来,有效且轻松地解析json的最佳方法是什么?
答案 0 :(得分:12)
我支持这个上的什么东西,抓取数据然后序列化到磁盘。
下面的代码显示了第一个阶段,抓取并将JSON解析为JSON对象并保存到磁盘
// Create a new HTTP Client
DefaultHttpClient defaultClient = new DefaultHttpClient();
// Setup the get request
HttpGet httpGetRequest = new HttpGet("http://example.json");
// Execute the request in the client
HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
// Grab the response
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
String json = reader.readLine();
// Instantiate a JSON object from the request response
JSONObject jsonObject = new JSONObject(json);
// Save the JSONOvject
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(getCacheDir(),"")+"cacheFile.srl"));
out.writeObject( jsonObject );
out.close();
将JSONObject序列化并保存到磁盘后,您可以随时使用以下命令将其加载回来:
// Load in an object
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(new File(getCacheDir(),"")+"cacheFile.srl")));
JSONObject jsonObject = (JSONObject) in.readObject();
in.close();
答案 1 :(得分:7)
你最好的选择可能是GSON
它很简单,非常快速,易于序列化和反序列化json对象和POJO,可自定义,虽然通常没有必要,它很快就会出现在ADK中。在此期间,您只需将其导入您的应用即可。还有其他的库,但这几乎肯定是开始为Android和json处理的新人以及其他所有人的最佳起点。
如果你想要保存数据,这样你就不必每次都需要它下载它,你可以将你的json反序列化为一个java对象(使用GSON)并使用ORMLite来简单地推送你的对象进入一个sqlite数据库。或者,您可以将json对象保存到文件中(可能在cache directory中),然后使用GSON作为ORM。
答案 2 :(得分:0)
使用listview显示数据非常简单example。我使用非常相似的代码来显示数据,但我有一个自定义适配器。如果您只是使用文本和数据,它将工作正常。如果你想要更强大的东西,你可以使用延迟加载器/图像管理器的图像。
答案 3 :(得分:0)
由于http请求非常耗时,因此使用异步任务将是最好的选择。否则主线程可能会抛出错误。下面显示的类可以异步进行下载
private class jsonLoad extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
@Override
protected void onPostExecute(String result) {
// Instantiate a JSON object from the request response
try {
JSONObject jsonObject = new JSONObject(result);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
File file = new File(getApplicationContext().getFilesDir(),"nowList.cache");
try {
file.createNewFile();
FileOutputStream writer = openFileOutput(file.getName(), Context.MODE_PRIVATE);
writer.write(result);
writer.flush();
writer.close();
}
catch (IOException e) { e.printStackTrace(); return false; }
}
}
与其他答案不同,此处下载的json字符串本身保存在文件中。所以序列化不是必需的 现在可以通过调用
来完成从url加载json jsonLoad jtask=new jsonLoad ();
jtask.doInBackground("http:www.json.com/urJsonFile.json");
这会将内容保存到文件中。 打开保存的json字符串
File file = new File(getApplicationContext().getFilesDir(),"nowList.cache");
StringBuilder text = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
text.append(line);
text.append('\n');
}
br.close();
}
catch (IOException e) {
//print log
}
JSONObject jsonObject = new JSONObject(text);