【问题标题】:json returned from CI REST API is failing jsonlint tests从 CI REST API 返回的 json 未通过 jsonlint 测试
【发布时间】:2015-03-14 09:16:06
【问题描述】:

我在 codeigniter REST 应用程序中有以下代码(使用:https://github.com/chriskacerguis/codeigniter-restserver 构建)

public function fullname_get()
{
   $fullname = array("fname"=>"john", "lname"=>"doe");
   $data["json"] = json_encode($fullname);
   $this->response($data["json"], 200);
}

当我调用 API 时,返回的 json 如下所示:

{\"fname\":\"john\",\"lname\":\"doe\"}

由于转义字符“\”,上述 json 字符串未通过 http://jsonlint.com/ 测试。 只是想知道我该如何解决这个问题? 我正在构建一个应该返回 json 的 REST api ...我必须确保它是合法的 json。

谢谢。

【问题讨论】:

  • 您可能已经启用了magic_quotes,这意味着您的 PHP 安装配置非常糟糕和/或已经过时了。
  • 您必须解释数组的来源,该代码会生成有效的 JSON:3v4l.org/pQNYR
  • “这会产生看起来像这样的 json” 不,它不会。我的猜测是,额外的反斜杠是由您输出 JSON 的方式添加的。
  • @T.J Crowder,说得好。我忘了提(抱歉,现在头冷了)我正在使用 CI 和 CI 的 REST 库。我错过了一大块信息……对不起,伙计们。我将使用 log_message() 记录 json_encode 的结果
  • 所以在我调用 $this->response() 之后,json 看起来确实发生了变化。我还修改了问题的标题以更准确。

标签: php json codeigniter rest


【解决方案1】:

试试这个

 $fullname = array("fname"=>"john", "lname"=>"doe");
 $this->response($fullname, 200);//it sends data json format. You don't need to json encode it

您收到该响应是因为您的数据被 json 编码两次

【讨论】:

  • 谢谢。我不应该假设我必须手动编码。
【解决方案2】:

你必须去掉斜线,使用这个 stripslashes(json_encode($fullname))。完整代码如下:

public function fullname_get()
{
   $fullname = array("fname"=>"john", "lname"=>"doe");
   $data["json"] = stripslashes(json_encode($fullname));
   $this->response($data["json"], 200);
}

希望这能解决您的问题。

【讨论】:

    【解决方案3】:

    这是合法的 JSON - 你没有编写测试;)

    {
        "fname": "john",
        "lname": "doe"
    }
    

    请在http://ideone.com/5IW1Ef查看演示


    你正在使用的类做了神奇的事情:

    $this->response($this->db->get('books')->result(), 200);

    并根据 URL 上指定的格式,将响应数据转换为 JSON。您不必进行 JSON 编码。

    请阅读此处提供的示例 https://github.com/chriskacerguis/codeigniter-restserver#responses

     $fullname = array("fname"=>"john", "lname"=>"doe");
     $this->response($fullname, 200);
    

    http://code.tutsplus.com/tutorials/working-with-restful-services-in-codeigniter-2--net-8814

    【讨论】:

    • 你好。我刚刚添加了一些真正应该在第一篇文章中出现的细节。感谢您的耐心等待。
    • 您正在做的是再次将 JSON 序列化为 JSON。 $this->response($data, 200); 或者它在 PHP 上的名称。
    • 嗯,response() 方法会修改您的 JSON。它确实很多。 github.com/chriskacerguis/codeigniter-restserver/blob/master/…我的建议绕过那个废话:需要两件事。一个正确的标头,表明它是一个 JSON 响应和 JSON 本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2015-03-11
    • 2021-08-26
    • 2021-01-31
    • 2018-08-11
    相关资源
    最近更新 更多