当前位置: 首页 > 知识库问答 >
问题:

JSON格式错误的异常(Android Kotlin改装PHP MySQL)

尹乐邦
2023-03-14

我正在用Kotlin PHP MySql开发一个应用程序。

如果有人知道为什么我在调用createUser函数时会出现此异常“com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(true)在第1行第1列路径接受格式错误的JSON”,我将不胜感激。

当我使用相同的api调用getUser函数时,我没有得到异常。

我在《邮差》中检查了这两个功能。JSON格式正确。以“<代码>{”键“:”值“,”键1“:”值1“,…}开头

这是我的api:

     interface Api {
     ...
     @POST("/api/v1/users/register_user.php")
     suspend fun createUser(
         @Body userDto: UserInfoPreviewDto
     ) : QueryResponse

     @POST("/api/v1/users/get_user.php")
     suspend fun getUser(
         @Body  jsonObject : JsonObject
     ) : UserDto
    }

和我的Retrofit实例:

    Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
        .create(RamonApiUser::class.java)

我的服务器端php代码是register\u user。php文件:

      header("Access-Control-Allow-Origin: *");
      header("Content-Type: application/json; charset=UTF-8");
      header("Access-Control-Allow-Methods: POST");
      header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow- 
            Headers, Authorization, X-Requested-With");
      include_once("../../config/database.php");
      include_once("../../classes/user.php");
      $db = new Database();
      $connection = $db->connect();
      $user = new User($connection);
      if($_SERVER['REQUEST_METHOD'] === "POST") {
        $data = json_decode(file_get_contents("php://input"));
        $user->username =  $data->username;
        $user->password =  $data->password;
        $user->fullname =  $data->fullname;
        $user->email =  $data->email;
        if($user->register()) {
            http_response_code(200);
            $result = array( 
                "status" => "200", 
                "message" => "saved"
            );
            echo json_encode($result);
         }
         else {
            http_response_code(500);
            echo json_encode(array(
                "status" => "500",
                "message" => "Error 500"   
            ));
        }    
      }
      else {
          http_response_code(503);
          echo json_encode(array(
                                 "status" => "503",
                                 "message" => "Error 503"   
                           ));
      }

这是我的get\u用户。php文件:

    header("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json; charset=UTF-8");
    header("Access-Control-Allow-Methods: POST");
    header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, 
             Authorization, X-Requested-With");
    include_once("../../config/database.php");
    include_once("../../classes/user.php");
    $db = new Database();
    $connection = $db->connect();
    $user = new User($connection);  
    if($_SERVER['REQUEST_METHOD'] === "POST") {
        $param = json_decode(file_get_contents("php://input"));
        if(!empty($param->id)) {
            $user->id = $param->id;
            $user_data = $user->getById();
            if (!empty($user_data)) {
                http_response_code(200);
                $user_data['isPublicProfile'] = (bool)$user_data['isPublicProfile']; 
                $user_data['isLastOnlineVisible'] = 
                                     (bool)$user_data['isLastOnlineVisible'];
                $user_data['isPhoneNumberVisible'] = 
                                     (bool)$user_data['isPhoneNumberVisible'];
                echo json_encode($user_data);
            }
        } 
     }
     else {
          http_response_code(503);
          echo json_encode(array(
                     "status" => "0",
                     "message" => "503 error"   
       ));
     }

user中的getById()函数。php:

    public function getById() {
        $sqlQuery = "SELECT * FROM ". $this->table_name ." WHERE id = ? LIMIT 0,1";
        $obj = $this->conn->prepare($sqlQuery);
        $obj->bind_param("i", $this->id);
        $obj->execute();
        $data = $obj->get_result();
        return $data->fetch_assoc();
    }

我在客户端有查询响应数据类,其中包含字段状态和消息。用户-

    $query_response = new QueryResponse();
    $query_response->status = "200";
    $query_response->message = "registration successful";
    $echo json_encode($query_response);

它也没有帮助。


共有1个答案

叶建柏
2023-03-14

我创建了另一个名为get_query_response.php.的文件,只是为了确保我的查询响应类是正常的,不会抛出异常。

get_query_response.php:

     ....
     include_once("../../config/database.php");
     include_once("../../classes/query_response.php");
     $db = new Database();
     $connection = $db->connect();
     $query_response = new QueryResponse($connection);
     if($_SERVER['REQUEST_METHOD'] === "POST") {
            $query_response->id = 1;
            $query_response_data = $query_response->getById();
            // I fetch query_response_data from mysql
            if (!empty($query_response_data)) {
                http_response_code(200);
                $result = array(
                    "status" => "500",
                    "message" => "save successfully"
                );
                echo json_encode($result); // doesn't throw exception. 
                                               works fine
                //echo json_encode($query_response_data); 
                //when i use this line, it doesn't throw exception 
                //either. works fine
            }       
      }

我将此文件称为get\u query\u response。我的api中的php如下所示:

    interface MyApi {
    ...
    @POST("/api/v1/users/get_query_response.php")
    suspend fun getQueryResponse() : QueryResponse
    ...
    }

没有错误,没有例外。echo json\u encode($result)和echo json\u encode($query\u response\u data)都可以正常工作。两个register\u用户之间的唯一区别。php和get\u query\u response。php文件如下所示:

    $data = json_decode(file_get_contents("php://input"));

我不明白这两个文件行为不同的原因。它们几乎一模一样。为什么此代码在register\u user中不起作用。php?

            $result = array(
                "status" => "200",
                "message" => "saved successfully"
            );
            echo json_encode($result);

我终于解决了这个问题。这是我的数据类UserInfo。实例化期间,类的一个字段被分配为null。Api正在发送一个类,该类的两个属性具有空值。通过为这些属性指定值,可以解决此问题。

 类似资料:
  • 问题内容: 我正在尝试在正在构建的android应用中发出http POST请求,但是无论我使用哪个url,Eclipse都会不断引发格式错误的URL异常。我尝试了其中一个android教程中的一行代码: 甚至触发错误。Eclipse是否会为我尝试创建的任何URL不断引发此错误,原因是什么? 问题答案: 它不是在引发异常,而是在抱怨您没有处理 它可能 (即使不会) 的可能性 ,因为这种情况下的UR

  • 我正在尝试使用改装将图像上载到本地服务器。下面是我的php代码。 但是我得到了这样一个错误:com.google.gson.stream.MalformedJsonException使用JsonReader.setLenient(true)在第1行第1列路径$处接受格式错误的JSON。 然后,我在初始化改装的类中添加了以下代码。 现在我得到以下错误:com.google.gson.JsonSynt

  • 我想做张桌子。我希望这些数字向左对齐。我不熟悉格式化,不知道为什么会出现错误。

  • 我想从JSON中获取一些数据,但gson给出了错误。我想知道如何解决这个问题? 我使用的是dagger2(这部分100%正常工作)和rxJava(这部分总是调用onError方法)。 我的型号: 我的JSON: 我的回应: 我的改装: 我的服务: 错误: com.google.gson.stream.MalformedJsonException:使用JsonReader.setLenient(tr

  • 我在我的项目中使用Gson。但它返回给我错误 我得到一个服务器响应,如下所示 我有一个错误,需要一个字符串,但是BEGIN_OBJECT 我应该如何处理这个异常?? 我没有访问数据库的权限,因为我使用API

  • 我有一个基于Spring Security OAuth2的REST应用程序。我一直试图将默认的Spring Security消息传递格式从XML更改为JSON,并取得了部分成功。 对于eg--我知道了当请求不包含承载令牌时如何更改响应格式(下面一行就是这样做的) 如何更改BadCredentialsException JSON格式?当前,它返回一个类似于上面的JSON? 下面是我的applicat