【问题标题】:[UPDATE]How do I access values from the json object?[更新]如何访问 json 对象的值?
【发布时间】:2017-05-05 10:41:54
【问题描述】:

我对 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)

我该怎么做?提前致谢。

【问题讨论】:

  • 把你的实际 json 响应放在这里
  • 您对此有任何错误吗?
  • @BhupatBheda {"count":["4"],"tasks0":["collect paper"],"tasks1":["krishna"],"tasks2":["mys" ],"tasks3":["bng"]} 我的 JSON 响应
  • "tasks[0]"... 是 json 数组而不是对象。
  • @SachinGupta 我的 php 代码运行良好。我什至得到了一个有效的响应。我只需要在 android 中解析我的 json 对象。

标签: java php android json


【解决方案1】:

试试这个;

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));
                }

            }

【讨论】:

  • 这是我出错的地方!非常感谢..现在一切正常:)
【解决方案2】:

试试下面的代码:

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]);
                    }

                }

【讨论】:

  • 现在我可以检索 MAX_ROWS 但不能检索我的任务名称
  • 有异常吗?你试过我更新的代码吗?我已经编辑了我的代码
  • 我得到 NullPointerException
  • OK 在 for 循环之前使用以下代码:taskname = new String[MAX_ROWS];
  • @CAAnusha 你用数组大小​​声明taskname[] 吗?可能你在taskname[] 上面临 NPE
【解决方案3】:

让 Json 喜欢 ;

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

然后要解析上面的 JSON,请使用以下代码;

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

【讨论】:

  • 我试过了。我没有得到您指定的格式。你能告诉我我的 php 代码哪里出错了吗??
  • $taskcount['count']= array($row2['count(*)']);从上面的代码中删除array() & task
  • 这个 JSON 是否正确? { "count": "4", "tasks0": "collect paper", "tasks1": "krishna", "tasks2": "mys", "tasks3": "bng" }
  • 是的,它叫做 JSONObject。有关更多信息,请参阅此; w3schools.com/js/js_json_objects.asp
  • 但是如何访问我的任务??
【解决方案4】:

你的代码有几个错误:

  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]);
}

【讨论】:

  • 我得到空指针异常
【解决方案5】:

这可能会解决您的问题

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"
   ]
}

这样你就可以简单地用像Gson这样的库(反)序列化它 使用以下 POJO:

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;
}

}

这样操作数据和来回传递数据就容易多了(恕我直言)。 祝你好运!

【讨论】:

  • 谢谢! { "count": "4", "tasks": [ "collect paper", "krishna", "mys", "bng" ] } 这就是你想要我的 JSON 对象的样子吗??
  • 欢迎,这只是一个建议,但我会这样做!另请注意,它应该是"count": 4(4 周围没有引号),以便 json 反序列化器可以理解它是一个数字。这样,您可以将其反序列化为我的初始答案中显示的对象(即 TaskHolder,使用例如 gson 库)或使用 getInt("count") 从 JsonObject 获取它。
【解决方案6】:

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

对于 Json,你知道有两个括号,第一个是“[]”,它显示为 Json 数组,另一个是“{}”,它显示 Json 对象,所以如果你想从 json 对象解析数据,那么它的难度如果你完全理解 json 数据的结构,

这里是解释 json 解析的例子

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

现在如果你想访问一个 then just 结构,第一个是 Object 所以创建 JSON 对象并将字符串放入 Argument。

JSONObject json=new JSONObject(jsonData);

第二个是数组,所以需要放入数组,JSONObject 和 JSONArray Object 也提供了一些有助于解析数据的默认方法,

JSONArray jsonArray=json.getJsonArray(位置); //'a'的位置1 String finalData=jsonArray.getString(0);

现在在尝试你的代码之后,

【讨论】:

  • 非常感谢您的建议!
【解决方案7】:
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]);
                    }

【讨论】:

    【解决方案8】:

    让我们将您的 json 响应视为字符串结果,并使用以下代码解析 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();
            }
    

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2012-06-06
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2014-07-16
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多