【问题标题】:How to validate JSON in PHP older than 5.3.0?如何在 PHP 5.3.0 之前验证 JSON?
【发布时间】:2011-12-12 02:28:45
【问题描述】:

有什么方法可以在不使用json_last_error() 的情况下检查变量是否是PHP 中的有效JSON 字符串?我的 PHP 版本低于 5.3.0。

【问题讨论】:

  • 你有什么版本的PHP?
  • 即使你不知道确切的语法错误,你仍然可以测试一个有效值是否来自仅仅解码它。 (或者使用正则表达式来验证它。哈)
  • json_decode 将在失败时返回 null,它在 PHP >= 5.2 上可用。
  • PHP is_json function? 的可能重复项

标签: php json well-formed


【解决方案1】:
$ob = json_decode($json);
if($ob === null) {
 // $ob is null because the json cannot be decoded
}

【讨论】:

  • 如果 json 字符串是一个简单的(有效的)“假”值,则失败。
  • 不幸的是,这不是真正的验证。仍然可以发送无效的 json,但 json_decode() 会解释它,但不会以您期望的方式。这被认为是有效的 json:{"request": { "filterBy": "MCC" "startDate": "Sun, 02 Sep 2012 12:51:44 -0400", "endDate": "Tue, 02 Oct 2012 00:00:00 -0400" }},即使“MCC”之后缺少逗号
  • @Webnet 在jsonlint.com 测试,您的字符串未通过验证。你能指出一个说明你的字符串有效的规范或工具吗?
  • 它也可以双向使用。有一些控制字符,例如 ASCII 26,当它出现在 json 中时,会导致 json_decode() 总是失败,即使你用 javascript 解析相同的字符串,它也会成功。哪种行为是理想的行为取决于您的应用程序。
  • @Tayyab_Hussain 您的无效案例通过了,因为 PHP 实现了RFC 7159 中指定的 JSON 与 RFC 4627 中指定的“经典”JSON 的超集。请参阅manual 页面上的顶部注释。 RFC7159 允许不包含在数组或对象中的简单标量值,因此是“有效的 JSON”。另见this question
【解决方案2】:
$data = json_decode($json_string);
if (is_null($data)) {
   die("Something dun gone blowed up!");
}

【讨论】:

  • 你会因为添加幽默和教我一个新功能而得到一个升级:is_null
【解决方案3】:

如果您想检查您的输入是否是有效的 JSON,您不妨对验证它是否遵循特定格式(即模式)感兴趣。在这种情况下,您可以使用JSON Schema 定义您的架构并使用此library 对其进行验证。

例子:

person.json

{
    "title": "Person",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        }
    },
    "required": ["firstName", "lastName"]
}

验证

<?php

$data = '{"firstName":"Hermeto","lastName":"Pascoal"}';

$validator = new JsonSchema\Validator;
$validator->validate($data, (object)['$ref' => 'file://' . realpath('person.json')]);

$validator->isValid()

【讨论】:

    【解决方案4】:

    此外,您还可以查看 http://php.net/manual/en/function.json-last-error-msg.php,其中包含缺失函数的实现。

    其中一个是:

    if (!function_exists('json_last_error_msg')) {
            function json_last_error_msg() {
                static $ERRORS = array(
                    JSON_ERROR_NONE => 'No error',
                    JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
                    JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
                    JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
                    JSON_ERROR_SYNTAX => 'Syntax error',
                    JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
                );
    
                $error = json_last_error();
                return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error';
            }
        }
    

    (从网站复制粘贴)

    【讨论】:

      【解决方案5】:

      您可以检查来自json_decode 的值是否为null。如果是,则无效。

      【讨论】:

      • 我正在使用 json_decode 函数,它的行为非常奇怪。如果我发送这样的请求:api.nblackburn.me/…{},它可以工作,但如果我添加一些有效的 json,它不会,有什么想法吗?
      • 向我们展示您尝试解析的 JSOn。
      猜你喜欢
      • 2020-08-16
      • 2022-11-10
      • 2017-07-05
      • 2016-12-30
      • 2021-07-15
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      • 2014-09-01
      相关资源
      最近更新 更多