Я начинаю разрабатывать android и пытаюсь сделать и приложение с listView, отображающее строковые значения JSON.Как получить значение String из JSON?
Ниже часть моего кода:
String jsonResult = "";
int animal_id = 0;
String ani_name = "asd", sci_name = "fgh";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bestiary);
.
.
.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
for (int i = 0; i < 10; i++) {
if (position == i) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
uploadToServer();
Log.d(TAG, "my thread works");
Log.d(TAG, jsonResult);
testReceiveData(jsonResult, position); //It said position needs to be declared final above
Log.d(TAG, "maybe this one works too");
Log.d(TAG, ani_name);
}
});
Log.d(TAG, "thread get started");
}
Intent intent = new Intent(BestiaryActivity.this, BestiaryDetailActivity.class);
Bundle bundle = new Bundle();
bundle.putString("aniString", ani_name);
bundle.putString("sciString", sci_name);
intent.putExtras(bundle);
startActivity(intent);
}
}
});
}
public void testReceiveData(String jsonResult, int position) {
try {
JSONArray arr = new JSONArray(jsonResult);
JSONObject jsonObj = arr.getJSONObject(position);
String animalName = jsonObj.getString("name");
String scienceName = jsonObj.getString("sci_name");
Log.d(TAG, "It gets JSONObject");
ani_name = animalName;
sci_name = scienceName;
Log.d(TAG, "Convert them");
} catch (JSONException e) {
e.printStackTrace();
}
}
@SuppressWarnings("deprecation")
public boolean uploadToServer() {
try {
String responseString = null;
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(urlServer);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("aniName", Integer.toString(aniNumber)));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httpPost);
Log.d(TAG, "amHere");
HttpEntity result = response.getEntity();
if (result != null) {
InputStream input = result.getContent();
String resultString = convertStreamToString(input);
Log.d(TAG, resultString);
jsonResult = resultString;
Log.d(TAG, "jesonResult works");
} else {
Log.d(TAG, "broke in repsonse");
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
Тогда мой файл JSON выглядит следующим образом:
Породы: { "animal_id": "1", "имя": "Американский Робин", «sci_name»: «Turdus migratorius»}
Я ожидал, что ani_name будет изменено на American Robin и sci_name на Turdus migratorius, поэтому мое следующее действие отобразит это значение, но ani_name все еще asd, а sci_name - fgh.
Я проверил Log.d (TAG, jsonResult); имеет JSON
Могу ли я спросить вас, что я сделал не так, и как это исправить?
О, и они от LogCat
07-27 01:49:12.435 6867-6867/com.example.kange1.bert I/art﹕ Late-enabling -Xcheck:jni
07-27 01:49:12.639 6867-6885/com.example.kange1.bert D/OpenGLRenderer﹕ Use EGL_SWAP_BEHAVIOR_PRESERVED: true
07-27 01:49:12.646 6867-6867/com.example.kange1.bert D/Atlas﹕ Validating map...
07-27 01:49:12.669 6867-6885/com.example.kange1.bert I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 01/15/15, ab0075f, Id3510ff6dc
07-27 01:49:12.670 6867-6885/com.example.kange1.bert I/OpenGLRenderer﹕ Initialized EGL, version 1.4
07-27 01:49:12.694 6867-6885/com.example.kange1.bert D/OpenGLRenderer﹕ Enabling debug mode 0
07-27 01:49:18.890 6867-6867/com.example.kange1.bert D/BestiaryActivity﹕ thread get started
07-27 01:49:18.958 6867-6867/com.example.kange1.bert D/AndroidRuntime﹕ Shutting down VM
07-27 01:49:18.959 6867-6867/com.example.kange1.bert E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.kange1.bert, PID: 6867
java.lang.ArrayIndexOutOfBoundsException: length=9; index=9
at com.example.kange1.bert.BestiaryActivity$1.onItemClick(BestiaryActivity.java:216)
at android.widget.AdapterView.performItemClick(AdapterView.java:305)
at android.widget.AbsListView.performItemClick(AbsListView.java:1146)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053)
at android.widget.AbsListView$3.run(AbsListView.java:3860)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
07-27 01:49:18.981 6867-7152/com.example.kange1.bert D/BestiaryActivity﹕ amHere
07-27 01:49:18.982 6867-7152/com.example.kange1.bert D/BestiaryActivity﹕ Species : {"animal_id":"1","name":"American Robin","sci_name":"Turdus migratorius"}
07-27 01:49:18.982 6867-7152/com.example.kange1.bert D/BestiaryActivity﹕ jesonResult works
07-27 01:49:18.982 6867-7152/com.example.kange1.bert D/BestiaryActivity﹕ my thread works
07-27 01:49:18.982 6867-7152/com.example.kange1.bert D/BestiaryActivity﹕ Species : {"animal_id":"1","name":"American Robin","sci_name":"Turdus migratorius"}
07-27 01:49:18.982 6867-7152/com.example.kange1.bert W/System.err﹕ org.json.JSONException: Value Species of type java.lang.String cannot be converted to JSONArray
07-27 01:49:18.982 6867-7152/com.example.kange1.bert W/System.err﹕ at org.json.JSON.typeMismatch(JSON.java:111)
07-27 01:49:18.983 6867-7152/com.example.kange1.bert W/System.err﹕ at org.json.JSONArray.<init>(JSONArray.java:96)
07-27 01:49:18.983 6867-7152/com.example.kange1.bert W/System.err﹕ at org.json.JSONArray.<init>(JSONArray.java:108)
07-27 01:49:18.983 6867-7152/com.example.kange1.bert W/System.err﹕ at com.example.kange1.bert.BestiaryActivity.testReceiveData(BestiaryActivity.java:262)
07-27 01:49:18.983 6867-7152/com.example.kange1.bert W/System.err﹕ at com.example.kange1.bert.BestiaryActivity$1$1.run(BestiaryActivity.java:161)
07-27 01:49:18.983 6867-7152/com.example.kange1.bert W/System.err﹕ at java.lang.Thread.run(Thread.java:818)
07-27 01:49:18.983 6867-7152/com.example.kange1.bert D/BestiaryActivity﹕ maybe this one works too
07-27 01:49:18.983 6867-7152/com.example.kange1.bert D/BestiaryActivity﹕ asd
Я голосую, чтобы закрыть этот вопрос не по теме, потому что Google не нарушен. Так PLZ искать на нем. –
Просто следуйте по этой ссылке, вы найдете лучшие учебные ресурсы [http://www.mybringback.com/android-sdk/12924/android-tutorial-using-remote-databases-php-and-mysql-part-1/] – Wizard
Не ответ, а предложение: попробуйте GSON, это сделает код намного чище. – Hindol