【问题标题】:json_encode error handling PHP OOPjson_encode 错误处理 PHP OOP
【发布时间】:2017-09-22 18:34:43
【问题描述】:

在服务器端 (PHP),我使用 json_encode 对通过 ajax 请求 (javascript - extjs) 发送的数据进行编码。

如果可能的话,我想用 PHP OOP 处理可能的 json_encode 错误。

到目前为止,我有以下代码,但我遇到了一些困难(我对 php oop 没有经验):

类 ValidateJson

<?php

class ValidateJson {

    private $errors = array();

   // public static function validaJson(){

    public function validaJson(){

        //Get the last JSON error.
        $jsonError = json_last_error();

        //If this happen.
        //if(is_null($decoded) && $jsonError == JSON_ERROR_NONE){
        //   $this->addJsonErrorMsg('Could not decode JSON!');
        //}


        switch ($jsonError) {
            case JSON_ERROR_DEPTH:
                    $this->addJsonErrorMsg('Maximum stack depth exceeded');
                break;
            case JSON_ERROR_STATE_MISMATCH:
                 $this->addJsonErrorMsg('Underflow or the modes mismatch');
                break;
            case JSON_ERROR_CTRL_CHAR:
                 $this->addJsonErrorMsg('Unexpected control character found');
                break;
            case JSON_ERROR_SYNTAX:
                 $this->addJsonErrorMsg('Syntax error, malformed JSON');
                break;
            case JSON_ERROR_UTF8:
                 $this->addJsonErrorMsg('Malformed UTF-8 characters, possibly incorrectly encoded');
                break;
            default:
                 $this->addJsonErrorMsg(' Unknown error');
                break;
        }
    }

    private function addJsonErrorMsg($error_message){
        $this->errors[] = $error_message;
    }

    public function outJsonError(){
        return $this->errors;
    }

    // ?????
    //     if($jsonError != 0){
    //         throw "JSON Parse Error: " + untyped __call__("json_last_error_msg");
    //
    //    }
}

?>

查询和输出:

<?php

require('conect.php');
$action = $_REQUEST['action'];

switch($action){

  case "create":{

    $records = $_POST['records'];
    $data = json_decode(stripslashes($records));

    require_once('validate_json.php');
    $valida_json = new ValidateJson();
    $valida_json->validaJson();

   //  $errosJson = $valida_json->outJsonError();
   //  echo $errors; exit; //return string 'Array'

    if(json_last_error() == JSON_ERROR_NONE){

        $cars = $data->{'cars'};

        if ($_SERVER["REQUEST_METHOD"] == "POST") {

            $sqlQuery = "INSERT INTO the_cars (cars) VALUES (?)";

            if($statement = $con->prepare($sqlQuery)){
                $statement->bind_param("s", $cars);
                $statement->execute();
                $success= true;
            }else{
                $erro = $con->error;
                $success = false;
            }

            echo json_encode(array(
                "success" => $sucess,
                'errors'=> $erro
            ));

            $statement->close();
            $conexao->close();

            break;
        }

   }else{

        $errorsJson = $valida_json->outJsonError();
        $success = false;

         echo json_encode(array(
                "success" => $sucess,
                'errorsjson'=> $errorsJson
         ));
    }
}
?>

【问题讨论】:

    标签: php json validation


    【解决方案1】:

    我在尝试获取数组的 json_encode 时遇到此问题“格式错误的 UTF-8 字符,可能编码不正确” 这是它的解决方案

     function latin1_to_utf8($dat)
        {
         if (is_string($dat))
            return utf8_encode($dat);
         if (!is_array($dat))
            return $dat;
         $ret = array();
         foreach ($dat as $i => $d)
            $ret[$i] = array_utf8_encode($d);
         return $ret;
        }
        function array_utf8_encode($dat)
        {
             if (is_string($dat))
                 return utf8_encode($dat);
            if (!is_array($dat))
              return $dat;
          $ret = array();
          foreach ($dat as $i => $d)
              $ret[$i] = array_utf8_encode($d);
          return $ret;
        }
    

    【讨论】:

      【解决方案2】:

      尝试从public static function validaJson(){ 中删除static

      通过将 validaJson 定义为静态,您没有可使用的 validaJson ($this) 工作实例。

      同样在validaJson 内部,您还有is_null($decoded),因为变量$decoded 不在该函数的任何地方。

      见:http://php.net/manual/en/language.oop5.static.php

      【讨论】:

      • 感谢 Aknosis。我听从了你的建议。由于某种原因,在查询中,在 $valida_json->validateJson(); 之后如果我插入 $errorsJson = $ valida_json-> outJsonError ();后跟 echo $errorJson; exit ;,只获取 Array 字符串而不是错误消息, addJsonErrorMsg 函数有问题吗?我的查询代码是用 echo 描述的。
      • addJsonErrorMsg 看起来不错,但它返回一个数组。通过 echo 输出数组会发出通知“注意:数组到字符串的转换”。尝试使用var_dump($errorsJson ) 而不是echo
      • 您有什么建议可以解决这个问题吗?我需要将错误消息发送给客户端。从 json 错误的情况来看,一次检查多个的可能性似乎很小。无论如何,如果我通过将代码更改为私有 $errors = ''; 来删除数组和 $ this-> errors = $ error_message;我正确地得到了错误信息(但是这样只能得到一个错误信息)。
      • 我认为您可能遇到了另一个问题。将错误编码为数组时,它们应该编码为 json 就好了。
      猜你喜欢
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2016-06-09
      • 1970-01-01
      相关资源
      最近更新 更多