2017-08-15 7 views
2

https://randomuser.meから得たjson文字列を読み込む際に問題があります。https://randomuser.me/api/からjsonファイルを読む方法

((TextView) findViewById(R.id.response_id)).setText(
     "title: " + json.optString("title")); 

ので、私ならば:私は問題はJSONファイル収縮、ここで私の要求の間であることを理解したよう

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ((Button) findViewById(R.id.start_button)).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       new WebServiceHandler().execute("https://randomuser.me/api/"); 
       //.execute("http://damianchodorek.com/wsexample/"); 
       //.execute("https://randomuser.me/api/?results=5&inc=name,email,picture"); 
      } 
     }); 
    } 

    private class WebServiceHandler extends AsyncTask<String, Void, String>{ 

     // okienko dialogowe, które każe użytkownikowi czekać 
     private ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

     // metoda wykonywana jest zaraz przed główną operacją (doInBackground()) 
     // mamy w niej dostęp do elementów UI 
     @Override 
     protected void onPreExecute() { 
      // wyświetlamy okienko dialogowe każące czekać 
      dialog.setMessage("Czekaj..."); 
      dialog.show(); 
     } 

     // główna operacja, która wykona się w osobnym wątku 
     // nie ma w niej dostępu do elementów UI 
     @Override 
     protected String doInBackground(String... urls) { 

      try { 
       // zakładamy, że jest tylko jeden URL 
       URL url = new URL(urls[0]); 
       URLConnection connection = url.openConnection(); 

       // pobranie danych do InputStream 
       InputStream in = new BufferedInputStream(connection.getInputStream()); 

       // konwersja InputStream na String 
       // wynik będzie przekazany do metody onPostExecute() 
       return streamToString(in); 

      } catch (Exception e) { 
       // obsłuż wyjątek 
       Log.d(MainActivity.class.getSimpleName(), e.toString()); 
       return null; 
      } 
     } 

     // metoda wykonuje się po zakończeniu metody głównej, 
     // której wynik będzie przekazany; 
     // w tej metodzie mamy dostęp do UI 
     @Override 
     protected void onPostExecute(String result) { 
      //Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG).show(); 
      // chowamy okno dialogowe 
      dialog.dismiss(); 

      try { 
       //Toast.makeText(getApplicationContext(),result,Toast.LENGTH_LONG).show(); 
       // reprezentacja obiektu JSON w Javie 
       JSONObject json = new JSONObject(result); 

       // pobranie pól obiektu JSON i wyświetlenie ich na ekranie 
       ((TextView) findViewById(R.id.response_id)).setText("title: " 
         + json.optString("title")); 
       ((TextView) findViewById(R.id.response_name)).setText("first: " 
         + json.optString("first")); 

      } catch (Exception e) { 
       // obsłuż wyjątek 
       Log.d(MainActivity.class.getSimpleName(), e.toString()); 
      } 
     } 
    } 

    // konwersja z InputStream do String 
    public static String streamToString(InputStream is) { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder stringBuilder = new StringBuilder(); 
     String line = null; 

     try { 
      while ((line = reader.readLine()) != null) { 
       stringBuilder.append(line + "\n"); 
      } 
     } 
     reader.close(); 

     } catch (IOException e) { 
      // obsłuż wyjątek 
      Log.d(MainActivity.class.getSimpleName(), e.toString()); 
     } 
     return stringBuilder.toString(); 
    } 
} 

{ 
    "results": [{ 
     "gender": "male", 
     "name": { 
      "title": "mr", 
      "first": "romain", 
      "last": "hoogmoed" 
     }, 
     "location": { 
      "street": "1861 jan pieterszoon coenstraat", 
      "city": "maasdriel", 
      "state": "zeeland", 
      "postcode": 69217 
     }, 
     "email": "[email protected]", 
     "login": { 
      "username": "lazyduck408", 
      "password": "jokers", 
      "salt": "UGtRFz4N", 
      "md5": "6d83a8c084731ee73eb5f9398b923183", 
      "sha1": "cb21097d8c430f2716538e365447910d90476f6e", 
      "sha256": "5a9b09c86195b8d8b01ee219d7d9794e2abb6641a2351850c49c309f1fc204a0" 
     }, 
     "dob": "1983-07-14 07:29:45", 
     "registered": "2010-09-24 02:10:42", 
     "phone": "(656)-976-4980", 
     "cell": "(065)-247-9303", 
     "id": { 
      "name": "BSN", 
      "value": "04242023" 
     }, 
     "picture": { 
      "large": "https://randomuser.me/api/portraits/men/83.jpg", 
      "medium": "https://randomuser.me/api/portraits/med/men/83.jpg", 
      "thumbnail": "https://randomuser.me/api/portraits/thumb/men/83.jpg" 
     }, 
     "nat": "NL" 
    }], 
    "info": { 
     "seed": "2da87e9305069f1d", 
     "results": 1, 
     "page": 1, 
     "version": "1.1" 
    } 
} 

以下の私のコード:これはJSONファイルであります"title""results"に変更すると、optString()メソッドでは通常、jsonの"results"フィールド内にあるものがすべて印刷されます。 "title"フィールドのみから値を取得する方法は、optString()に書き込む必要がありますか?

答えて

0

何かこれはうまくいくはずです。あなたのjsonドキュメントは単純な "フィールド構造"ではないので、型固有のgetter関数を使う必要があります。

jsonObj.getJSONArray("results") 
    .getJSONObject(0) 
    .getJSONObject("name") 
    .optString("title") 
+0

ありがとうございます! –

関連する問題