【问题标题】:ANDROID - how to display JSONArray into textviewANDROID - 如何将 JSONArray 显示到 textview 中
【发布时间】:2017-03-04 12:13:39
【问题描述】:

我已经设置了一个 php 脚本来创建 json here,但是当我尝试显示 JSONArray 时,我的 Android 监视器上出现了类似这样的错误..

Value (html)(body)(java.lang.String 类型的脚本无法转换为 JSONArray

谁能告诉我怎么解决?

MainActivity.java

package flix.yudi.okhttp1;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    private String TAG = MainActivity.class.getSimpleName();

    private ProgressDialog pDialog;
    private ListView lv;

    // URL to get contacts JSON
    private static String url = "http://zxccvvv.cuccfree.com/send_data.php";

    ArrayList<HashMap<String, String>> contactList;

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

        contactList = new ArrayList<>();

        lv = (ListView) findViewById(R.id.list);

        new GetContacts().execute();
    }

    /**
     * Async task class to get json by making HTTP call
     */
    private class GetContacts extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Please wait...");
            pDialog.setCancelable(false);
            pDialog.show();

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(url);

            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONArray jsonObj = new JSONArray(jsonStr);

                    // Getting JSON Array node
                    JSONArray pertanyaan = jsonObj.getJSONArray("pertanyaan");

                    // looping through All Contacts
                    for (int i = 0; i < pertanyaan.length(); i++) {
                        JSONObject c = pertanyaan.getJSONObject(i);

                        String id = c.getString("id");
                        String ask = c.getString("ask");

                        // tmp hash map for single contact
                        HashMap<String, String> pertanyaans = new HashMap<>();

                        // adding each child node to HashMap key => value
                        pertanyaans.put("id", id);
                        pertanyaans.put("ask", ask);

                        // adding contact to contact list
                        contactList.add(pertanyaans);
                    }
                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Json parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });

                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get json from server. Check LogCat for possible errors!",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });

            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            // Dismiss the progress dialog
            if (pDialog.isShowing())
                pDialog.dismiss();
            /**
             * Updating parsed JSON data into ListView
             * */
            ListAdapter adapter = new SimpleAdapter(
                    MainActivity.this, contactList,
                    R.layout.list_item, new String[]{"ask"}, new int[]{R.id.ask});

            lv.setAdapter(adapter);
        }

    }
}

HttpHandler.java

package flix.yudi.okhttp1;

import android.util.Log;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class HttpHandler {

    private static final String TAG = HttpHandler.class.getSimpleName();

    public HttpHandler() {
    }

    public String makeServiceCall(String reqUrl) {
        String response = null;
        try {
            URL url = new URL(reqUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            // read the response
            InputStream in = new BufferedInputStream(conn.getInputStream());
            response = convertStreamToString(in);
        } catch (MalformedURLException e) {
            Log.e(TAG, "MalformedURLException: " + e.getMessage());
        } catch (ProtocolException e) {
            Log.e(TAG, "ProtocolException: " + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "IOException: " + e.getMessage());
        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.getMessage());
        }
        return response;
    }

    private String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line).append('\n');
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

我从here得到了参考代码

有什么想法/另一种解决方法吗?

编辑

send_data.php
<?php
include 'dbconfig.php';
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
$sql = "SELECT id, ask FROM pertanyaan";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    // output data of each row
    while($row[] = $result->fetch_assoc()) {
       $json = json_encode($row);

    }
} else {
    echo "0 results";
}
mysql_close($dbname);
echo $json;
?>

【问题讨论】:

    标签: java php android json


    【解决方案1】:

    您正在尝试从 jsonObj 获取一个带有键 pertanyaan 的 jsonarray,它实际上是一个字符串值,因此只需在使用索引获取 json 对象时遍历数组

     JSONArray jsonObj = new JSONArray(jsonStr);
    
                        // Getting JSON Array node
                        //JSONArray pertanyaan = jsonObj.getJSONArray("pertanyaan"); problem
    
                        // looping through All Contacts
                         for (int i = 0; i < jsonObj.length(); i++) {
                        JSONObject c = jsonObj.getJSONObject(i);
    
                        String id = c.getString("id");
                        String ask = c.getString("ask");
    
                        HashMap<String, String> pertanyaans = new HashMap<>();
    
                        pertanyaans.put("id", id);
                        pertanyaans.put("ask", ask);
    
                        contactList.add(pertanyaans);
                    }
    

    注意:您的回复中没有带有密钥pertanyaanjasonarray

    PHP 更新:使用

    echo json_encode($json);
    

    【讨论】:

    • 我应该删除我的 > JSONArray pertanyaan = jsonObj.getJSONArray("pertanyaan");先生?
    • @Flix 是的,你不需要它,并使用jsonObj 代替pertanyaan,如我的帖子所示
    • 还是出现同样的错误,先生,我应该声明我的 php 代码来创建 JSON 吗?
    • @Flix 是的,它应该是 json 格式,所以在你的 php 中,响应应该发送为echo json_encode(your_response_string);
    • 我已经在上面添加了我的 send_data.php,先生,您觉得如何?我做错了什么?
    【解决方案2】:

    根据您的服务,收到回复后,您将获得JSONArray like this [{"id":"1","ask":"pertanyaan ke 1"},{"id":"2","ask":"pertanyaan ke 2"},{"id":"3","ask":"pertanyaan ke 3"},{"id":"4","ask":"pertanyaan ke 4"},{"id":"5","ask":"pertanyaan ke 5"}]

    您只需将此响应存储在JSONArray

    JSONArray jsonArray = new JSONArray();
    jsonArray = (response);
    

    现在您的 jsonArray 中有响应,因此您可以从中选择退出值。 这里是示例代码 sn -p

        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                String id = jsonArray.getJSONObject(i).getString("id");
                String ask = jsonArray.getJSONObject(i).getString("ask");
                Log.i("TAG", "id "+ id + " ask "+ ask);
                //you can set value to text view here
                textview.settext(id + " "+ ask);
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
        }
    

    【讨论】:

    • 我已经尝试了上面的代码,但是当我输入“response”时出现错误并告诉我创建一个名为 response 的新类,我应该这样做吗?
    • 您需要用正确的响应替换响应,即您从服务器得到的内容
    猜你喜欢
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2014-11-02
    • 2022-01-02
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多