簡體   English   中英

[更新]如何從json對象訪問值?

[英][UPDATE]How do I access values from the json object?

我是android和JSON的新手。 請幫我找到解決這個問題的方法 - 下面是我的php代碼。

    <?php 
require "conn.php";
header('Content-Type: application/json');
if(isset($_POST['mailid']))
{
    $mailid = $_POST['mailid'];
    $today="2017-05-05";//date('Y-m-d');
    $mysql_qry = "select employee_id from employee where employee_email='$mailid';";
    $result = mysqli_query($conn ,$mysql_qry);
    $row = mysqli_fetch_array($result);

    $emp_id=$row['employee_id'];
    if($emp_id)
    {
        $sql = "SELECT count(*) from task where employee_id='$emp_id' and task_date='$today';";
        $result1 = mysqli_query($conn ,$sql);
        $row2=mysqli_fetch_array($result1, MYSQL_ASSOC);

        if($result1) 
        {
            $taskcount['count']= $row2['count(*)'];
            $taskquery = "select task_name from task where employee_id='$emp_id' and task_date='$today';";
            $restask_name=mysqli_query($conn ,$taskquery);

            for($i=0;$row1=mysqli_fetch_array($restask_name);$i++)
            {
                $task_name[]= $row1[0];
            }
            $taskname['tasks']=$task_name;
            $array=array_merge($taskcount,$taskname);
            echo json_encode($array);
        }
        else 
        {
        echo json_encode($taskcount);
        }
    }
    else
    {
        echo "employee ID doesnt match!!";
    }
}
else
{
    echo "post variables are not set";
}
?>

我收到來自下面的服務器的回復 -

{
 "count": "4",
 "tasks": [
        "collect paper",
        "krishna",
        "mys",
        "bng"   ] 
}

我解析json對象的代碼如下 -

if (!result.equals("employee ID doesnt match!!") || !result.equals("post variables are not set")) {
                    JSONObject json = new JSONObject(result);

                    MAX_ROWS = Integer.parseInt(json.getString("count"));
                    System.out.println("rows:"+MAX_ROWS);
                    JSONArray tasks = json.getJSONArray("tasks");
                    for (int task_id = 0; task_id < MAX_ROWS; task_id++) {
                        taskname[task_id] = tasks.getString(task_id);//**LINE 153**
                        System.out.println(taskname[task_id]);
                    }

                }

現在我得到一個空指針異常,這是我的Stacktrace--

05-05 17:41:33.255 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:java.lang.NullPointerException
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at com.example.anusha.fieldworkemployeetracker.ViewtaskActivity$BackgroundWorker.doInBackground(ViewtaskActivity.java:153)
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at com.example.anusha.fieldworkemployeetracker.ViewtaskActivity$BackgroundWorker.doInBackground(ViewtaskActivity.java:107)
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-05 17:41:33.396 22823-23024/com.example.anusha.fieldworkemployeetracker W/System.err:     at java.lang.Thread.run(Thread.java:841)

我怎樣才能做到這一點? 提前致謝。

請嘗試以下代碼:

if (!result.equals("employee ID doesnt match!!") || !result.equals("post variables are not set")) {
                    JSONObject json = new JSONObject(result);
                    //JSONObject count = json.getJSONObject("task" + task_id);
                    JSONArray count = json.getJSONArray("count");
                    MAX_ROWS = Integer.parseInt(count.getString(0));
                    System.out.println("rows:" + MAX_ROWS);
                    for (int task_id = 0; task_id < MAX_ROWS; task_id++) {
                        JSONArray task = json.getJSONArray("task" + String.valueOf(task_id));
                        taskname[task_id] = task.getString(0);
                        System.out.println(taskname[task_id]);
                    }

                }

讓Json喜歡;

       { "count": 
            "4"
          ,
          "tasks0": 
            "collect paper"
          ,
          "tasks1": 
            "krishna"
          ,
          "tasks2": 
            "mys"
          ,
          "tasks3": 
            "bng"
}

然后解析JSON之上使用以下代碼;

 JSONObject json = new JSONObject(jsonResponseString);
  String countValue = json.getString("count");

您的代碼中存在多個錯誤:

  1. 在這里,您嘗試使用JSONObject的代碼訪問JSONArray。 例如: countJSONArray 所以你應該把它解析為JSONArray 像這樣:

     MAX_ROWS = json.getJSONArray("count").getInt(0); 
  2. 密鑰名稱是JSONObject中的任務,您應該使用適當的名稱。

     JSONArray tasks = json.getJSONArray("tasks" + task_id); 
  3. task_name也是一個JSONArray ,因此您應該相應地處理它。

所以工作代碼應該是這樣的:

MAX_ROWS = json.getJSONArray("count").getInt(0);
for (int task_id = 0; task_id < MAX_ROWS; task_id++) {
     JSONArray tasks = json.getJSONArray("tasks" + task_id);
     taskname[task_id] = task.getString("task_name");
     System.out.println(taskname[task_id]);
}

這可能會解決您的問題

JSONObject json = new JSONObject(result);
MAX_ROWS = json.getJSONArray("count").getInt(0);
System.out.println("rows:" + MAX_ROWS);
for (int task_id = 0; task_id < MAX_ROWS; task_id++) {
    JSONArray task = json.getJSONArray("tasks" + task_id);
    taskname[task_id] = task.getString(0);
    System.out.println(taskname[task_id]);
}

但是我認為JSON字符串存在更多結構性問題,這使得難以解析為對象。 即你將所有內容存儲為JSONArray(而不是它們的實際類型,例如int或String)。

就個人而言,我會考慮像這樣構造json:

{
   "count":4,
   "tasks":[
      "collect paper",
      "do Something else",
      "learn about json",
      "learn about gson"
   ]
}

這樣你可以使用以下POJO簡單地(de)使用像Gson這樣的庫來序列化它:

public class TaskHolder {

@SerializedName("count")
@Expose
private Integer count;
@SerializedName("tasks")
@Expose
private List<String> tasks = null;

public Integer getCount() {
return count;
}

public void setCount(Integer count) {
this.count = count;
}

public List<String> getTasks() {
return tasks;
}

public void setTasks(List<String> tasks) {
this.tasks = tasks;
}

}

這樣,操作數據並來回傳遞它會更容易(imho)。 祝好運!

在直接直接了解什么是json以及我們如何在android中使用之前。

對於Json,你知道有兩個括號,第一個是'[]',它顯示為Json數組,另一個是顯示Json對象的'{}',所以如果你想解析json對象的數據那么它的難度如果你完美的話了解json數據的結構,

這是一個解釋你json解析的例子

String jsonData="{"data":["a","b","c"]}";

現在,如果你想訪問當時正好的結構,首先是Object,所以創建JSON對象並將字符串放在Argument中。

JSONObject json=new JSONObject(jsonData);

第二個是數組,所以你需要把內部作為數組,JSONObject和JSONArray對象也提供一些有助於解析數據的defual方法,

JSONArray jsonArray = json.getJsonArray(postion); // postion 1 for'a'String finalData = jsonArray.getString(0);

現在,在嘗試代碼之后,

JSONObject json = new JSONObject(result);

                    MAX_ROWS = json.getJSONArray("count").getInt(0);
                    System.out.println("rows:" + MAX_ROWS);
                    for (int task_id = 0; task_id < MAX_ROWS; task_id++) {
                        JSONObject task = json.getJSONArray("task" + task_id);
                        taskname[task_id] = task.getString(0);
                        System.out.println(taskname[task_id]);
                    }

讓我們將您的json響應視為String結果,並使用以下代碼來解析json

String result = "{\"count\": [\"4\"],\"tasks0\": [\"collect paper\"],\"tasks1\": [\"krishna\"],\"tasks2\": [\"mys\"],\"tasks3\": [\"bng\"]}";
        JSONObject json = null;
        try {
            json = new JSONObject(result);
            String countString = json.getJSONArray("count").optString(0, "default_value");
            int MAX_ROWS = Integer.parseInt(countString);

            for (int task_id = 0; task_id < MAX_ROWS; task_id++) {
                String taskString = json.getJSONArray("tasks" + task_id).optString(0, "default_value");
                Log.d("Task Names", taskString);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

嘗試這個;

if (!result.equals("employee ID doesnt match!!") || !result.equals("post variables are not set")) {
                JSONObject json = new JSONObject(result);

              int  MAX_ROWS = Integer.parseInt(json.getString("count"));
                System.out.println("rows:"+MAX_ROWS);
                String taskname[] = new String[MAX_ROWS];
                JSONArray tasks = json.getJSONArray("tasks");
                for (int task_id = 0; task_id < MAX_ROWS; task_id++) {
                    taskname[task_id] = tasks.getString(task_id);
                    System.out.println(tasks.getString(task_id));
                }

            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM