【问题标题】:json_decode can't deserialize properlyjson_decode 无法正确反序列化
【发布时间】:2016-03-19 14:56:46
【问题描述】:

我已经制作了一个运行良好的 RestAPI,在我的脚本(核心文件)的顶部,我声明了这一点:

header('Content-Type: application/json;charset=utf-8');

现在的问题是,当我将 json 从客户端传递到我的 API 时。这个问题通常与POSTPUT 方法有关。仅当我使用 curl 传递这种类型的 json 时才会发生这种情况:

curl -i -d '{"test": "èè"}'

你怎么能看到我有一些重音字母。所以当我调用这个函数时:

$params = json_decode(file_get_contents("php://input"), true);

$params 变量返回 NULL。相反,如果我的 json 看起来像这样:

curl -i -d '{"test": "This is a test"}'

一切正常,$params 变量具有这种价值:

array(1) {
  ["test"]=>
  string(14) "This is a test"
}

我猜这个特殊字符会导致这个函数出现问题..有人有解决方案吗?

【问题讨论】:

  • 您的终端是 utf-8 安全的吗?即使使用{"test": "èè"},我也得到了正确的结果
  • @fusion3k 我在MINGW64 git 控制台和 Chrome 扩展(高级 RestFul API)上测试了这个。他们都报告了相同的结果。
  • 请进聊天室
  • @fusion3k 我正在聊天中

标签: php json api rest curl


【解决方案1】:

您可以使用正则表达式来确定输入行是否包含重音字符。

<?php

  preg_match("/[À-ÿ].*/", $input_line, $output_array);

  if(sizeof($output_array) > 0){
    echo "$input_line has accented characters";
  }

?>

你也可以看看URL encoding,因为我认为问题就在那里。

【讨论】:

  • 正则表达式?真的吗?这是缺少json_decode 吗?没有其他方法可以解决这个问题吗?
  • 还有一种可能的方式是在提交前encode
  • 嗯,urlencode() 似乎很有趣。我应该在每次需要解码 json 时使用它,还是可以在 API 的某些部分自动执行此操作?
  • 您应该在提交之前将值编码,è&amp;#232; 并使用 decode 将 &amp;#232; 更改回 è。但是解码可能不是必需的,但如果您不这样做,它会使 above 正则表达式无法完成其工作。
  • 对不起,我真的想避免使用正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多