【问题标题】:Get java.lang.String cannot be converted to JSONObject when trying to retrieve value from a specific column尝试从特定列检索值时获取 java.lang.String 无法转换为 JSONObject
【发布时间】:2016-01-10 14:06:10
【问题描述】:

说真的,我不知道这里出了什么问题。

这是我的work_details

假设 ID 是 3 ,所以我想检索 twd 属于 3 的 timeIn 和 timeOut (在我的代码中,我只想检索一行)。

  public void RetrieveTotalHours( final String ID) // ID(twd)=3
    {
        class GetHours extends AsyncTask<Void,Void,String> {
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(getActivity(),"Fetching...","Wait...",false,false);
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                showHours(s);
            }

            @Override
            protected String doInBackground(Void... params) {
                RequestHandler rh = new RequestHandler();
                String s = rh.sendGetRequestParam(Configs.RETRIEVE_HOURS,ID);
                return s;
            }
        }
        GetHours ge = new GetHours();
        ge.execute();

    }
    private void showHours(String json) {
        try {
            JSONObject jsonObject = new JSONObject(json);
            JSONArray result = jsonObject.getJSONArray(Configs.TAG_JSON_ARRAY);
            JSONObject c = result.getJSONObject(0);
            String MiNtimeIn = c.getString(Configs.TAG_IN); 
            String MaXtimeOut=c.getString(Configs.TAG_OUT);
            Log.e("min", MiNtimeIn);
            Log.e("max", MiNtimeOut);

    }

Retrieve_hours.php

 <?php
  define('HOST','127.0.0.1:3307');
  define('USER','root');
  define('PASS','');
  define('DB','androiddb');

  $con = mysqli_connect(HOST,USER,PASS,DB) or die('unable to connect');

  $twd= $_GET['id'];

 $sql = "select * FROM work_details WHERE twd = '".$twd."'";

  $res = mysqli_query($con,$sql);

  $result=array();


  while($row=mysqli_fetch_array($res)){
      array_push($result,array('id'=>$row[0],'project'=>$row[1],'work_description'=>$row[2],'percentage'=>$row[3],'timeIn'=>$row[4],'timeOut'=>$row[5]));
  }

  echo (json_encode(array("result"=>$result)));

mysqli_close($con);

?>

我可以看到日志上显示了一些内容。但是当我指定列时,我会收到这个烦人的错误。

<?php
  define('HOST','127.0.0.1:3307');
  define('USER','root');
  define('PASS','');
  define('DB','androiddb');

  $con = mysqli_connect(HOST,USER,PASS,DB) or die('unable to connect');

  $twd= $_GET['id'];

 $sql = "select timeIn , timeOut FROM work_details WHERE twd = '".$twd."'";

  $res = mysqli_query($con,$sql);

  $result=array();


  while($row=mysqli_fetch_array($res)){
      array_push($result,array('id'=>$row[0],'timeIn'=>$row[1],'timeOut'=>$row[2]));
  }

  echo (json_encode(array("result"=>$result)));

mysqli_close($con);

?>

错误

01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at org.json.JSON.typeMismatch(JSON.java:111)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:159)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at org.json.JSONObject.<init>(JSONObject.java:172)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.Edit_WorkDetails.showHours(Edit_WorkDetails.java:248)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.Edit_WorkDetails.access$000(Edit_WorkDetails.java:46)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.Edit_WorkDetails$1GetHours.onPostExecute(Edit_WorkDetails.java:232)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at com.example.project.myapplication.GUI.Edit_WorkDetails$1GetHours.onPostExecute(Edit_WorkDetails.java:220)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at android.os.AsyncTask.finish(AsyncTask.java:632)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at android.os.Looper.loop(Looper.java:146)
01-10 19:31:47.355    1298-1298/com.example.project.myapplication W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5602)
01-10 19:31:47.360    1298-1298/com.example.project.myapplication W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
01-10 19:31:47.360    1298-1298/com.example.project.myapplication W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:515)
01-10 19:31:47.360    1298-1298/com.example.project.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
01-10 19:31:47.360    1298-1298/com.example.project.myapplication W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
01-10 19:31:47.360    1298-1298/com.example.project.myapplication W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
01-10 19:31:47.380    1298-1298/com.example.project.myapplication D/AbsListView﹕ Get MotionRecognitionManager

为什么当我使用* 时会显示值,但是当我指定列名时它会给我错误?

【问题讨论】:

  • 您是否有可能将 timeln 作为时间对象,您需要将其显式转换为字符串,然后将其推送到 json(常见逻辑我不知道 php)???
  • @elrado 那么我的列名 timeIn 应该怎么做
  • HELO 任何人都可以向我解释这个吗?
  • @JohnJoe 这里有很多人愿意帮助你,这对我来说确实是一个好问题,但是全大写 tell meh y meh codes not workz 不会很快给你答复。
  • @N.Wouda 注意到了,下次不要了:(

标签: java php android


【解决方案1】:

在映射结果时,您正在映射未在 select 语句中选择的列 $id,并且可能在服务器端中断并向客户端返回不解析的 HTML 错误消息,修复行:

array_push($result,array('id'=>$row[0],'timeIn'=>$row[1],'timeOut'=>$row[2]));

到:

array_push($result,array('timeIn'=>$row[0],'timeOut'=>$row[1]));

【讨论】:

    【解决方案2】:

    @joe,

    问题来了:

    您的查询如下所示:

    select timeIn , timeOut FROM work_details ....
    

    您使用基于索引的数组访问行:

    array('id'=>$row[0],'timeIn'=>$row[1],'timeOut'=>$row[2])
    

    您获取 3 列而不是您在 SQL 中选择的 2 列


    我建议您在获取时不要使用数值数组,因为它们依赖于查询中字段的位置。如果您更改查询而不注意获取,这将导致问题和错误。您至少应该使用关联数组。

    例如:

    array('timeIn'=>$row['timeIn'],'timeOut'=>$row['timeOut'])
    

    更好的是你可以check how I fetched the array in your previous question

    它让您不必费心匹配字段

    $res = mysqli_query($con,$sql);
    $result=array();
    while($row=mysqli_fetch_array($res)){
        $result[] = $row;
    }
    echo (json_encode(array("result"=>$result)));
    

    【讨论】:

    • @JohnJoe 我扩展了我的答案,你应该这样调整你的代码,这样更不容易出错,不需要在循环中解析结果
    • 梅达你能看到这个吗? stackoverflow.com/questions/34707414/…
    • 但是在截图上他们都是 10 for twk
    • 是的,这就是我使用 min(id) 和 max(id) 的原因
    • 你可以开始一个新问题添加 JSON 吗
    猜你喜欢
    • 2019-07-10
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多