2012-03-07 57 views
4

こんにちは、私は最初のアンドロイドアプリを作成しています。私は、URLからJSONフィードを解析する最も効率的な方法を知りたいと思っています。それをどこかに保管しておけば、私はアプリの別の部分でそれを元に戻すことができます。私はどこにでも見てきたし、それを行うためのさまざまな方法を見つけたと私は行くために確信していません。あなたの意見では、効率的かつ簡単にJSONを構文解析する最良の方法は何ですか?Androidからparse jsonをURLから取り出して保存する

答えて

7

あなたの最善の策は、それは一般的に、それは必要はありません、すぐにADKに表示されるように設定されているが、シリアライズとJSONオブジェクトとPOJO、カスタマイズの間でデシリアライズするために、非常に速く、簡単な簡単ですおそらくGSON

です。それまでの間は、アプリにインポートできます。そこには他の図書館がありますが、これはアンドロイドとjsonの処理に新しい誰かのために、そして他の誰にとってもそのような点については、ほぼ確実に最善の場所です。

必要なときにデータをダウンロードする必要がないようにデータを保持したい場合は、GSONを使用してjsonを非直列化し(GSONを使用)、ORMLiteを使用してオブジェクトをsqliteデータベース。あるいは、jsonオブジェクトをファイル(おそらくcache directory)に保存してから、GSONをORMとして使用することもできます。

+0

+1 GSONの場合。それが私が使うものです。 – Cody

+0

範囲外ですが、GSONでは+1です。ヒント:-) – Pascal

0

これはかなり簡単ですexampleデータを表示するためにlistviewを使用しています。私は非常に似たようなコードを使ってデータを表示しますが、私はカスタムアダプターを持っています。テキストとデータだけを使用している場合、正常に動作します。より堅牢なものをお望みなら、イメージのためにレイジーローダ/イメージマネージャを使うことができます。

12

私はこの1つのwhatsthebeefを使ってデータを取得し、ディスクにシリアル化します。

次のコードは、あなたがJSONObjectがシリアライズさがあり、ディスクに保存すると、あなたがいずれかでそれをバックロードすることができます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(); 

に保存します

// 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

out.writeObject(jsonObject.toString());を使用しました。とJSONObject jsonObject =新しいJSONObject((String)in.readObject()); Stringは直列化可能ですが、JSONObjectはそうでないためです。 – FR073N

+1

JSONObjectは直列化できません。出力ストリームに使用すると、NotSerializableExceptionが発生します。有効なシリアライズ可能なオブジェクト(おそらくJSON文字列表現)を使用して回答を編集することを検討してください。 –

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); 
関連する問題