Android从url解析json并存储它

时间:2012-03-07 15:54:27

标签: android json

您好,我正在创建我的第一个Android应用程序,我想知道什么是从URL解析JSON Feed的最佳和最有效的方法。也理想我想将它存储在某处,以便我可以继续在应用程序的不同部分回到它。我到处寻找,发现了许多不同的方法,我不知道该去哪。在您看来,有效且轻松地解析json的最佳方法是什么?

4 个答案:

答案 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);