我在读取https://randomuser.me中的json字符串时遇到问题。这是json文件:
{
"results": [{
"gender": "male",
"name": {
"title": "mr",
"first": "romain",
"last": "hoogmoed"
},
"location": {
"street": "1861 jan pieterszoon coenstraat",
"city": "maasdriel",
"state": "zeeland",
"postcode": 69217
},
"email": "romain.hoogmoed@example.com",
"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"
}
}
我的代码如下:
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();
}
}
据我所知,问题出在json文件收缩和我的请求之间:
((TextView) findViewById(R.id.response_id)).setText(
"title: " + json.optString("title"));
因为如果我在"title"
方法中更改"results"
上的optString()
,通常会在json中打印"results"
字段内的所有内容。
我应该用optString()
方法写什么才能从"title"
字段获取值?
答案 0 :(得分:0)
这样的事情应该有效。您的json文档不是简单的“字段结构”,因此需要使用特定于类型的getter函数。
jsonObj.getJSONArray("results")
.getJSONObject(0)
.getJSONObject("name")
.optString("title")