【问题标题】:remove DOM tags from a JSON request从 JSON 请求中删除 DOM 标签
【发布时间】:2015-10-21 15:50:25
【问题描述】:

我正在为我的 iOS 手机应用程序构建一个 Web 服务,但我在处理 JSON 请求时遇到了一些问题。

我发现我的 JSON PHP 页面实际上是在将 DOM 元素标签返回给 JSON 序列化。

示例 JSON:

<html>
<body>
<pre>
{
    "results": [
        {
            "user": {
                "firstname": "jerry",
                "lastname": "barman",
                "username": "yellowbear927",
                "street": "2507 valley view ln",
                "thumbnail": "https:\/\/randomuser.me\/api\/portraits\/thumb\/women\/84.jpg",
                "rate": "9.00"
            }
        }
    ]
}
</pre>
</body>
</html>

这是 iOS 应用程序正在读取的内容,它会导致错误。如果我从 PHP 页面中删除 DOM 元素,没有错误并且代码工作正常,但是如果我需要从浏览器内部调试它,我的 JSON 看起来很糟糕。

无论如何我可以两全其美?

这是我的 PHP 示例:

$dataMult = array(
    "results" => array(
        array(
            "user" => array(
                "firstname" => "jerry",
                "lastname" => "barman",
                "username" => "yellowbear927",
                "street" => "2507 valley view ln",
                "thumbnail" => "https://randomuser.me/api/portraits/thumb/women/84.jpg",
                "rate" => "9.00"
            )
        )
    )
);



?>

<html>
<body>
    <pre>
    <?php echo json_encode($dataMult, JSON_PRETTY_PRINT);?>
    </pre>
</body>
</html>

这是我的 Swift 代码:

func getHTTPRequest(urlPath: String, onCompletion: ServiceResponse) {
    let url: NSURL = NSURL(string: urlPath)!

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in

        do {
            let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
            let json = JSON(jsonResult)
            onCompletion(json, error)
            let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            NSLog("%@", dataString!)
        } catch let error as NSError{
            print("Something went wrong.")
            print(error.localizedDescription)
            print(error.description)
            NSLog("%@", error)
            let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            NSLog("%@", dataString!)
        }

    })
    task.resume()
}

【问题讨论】:

  • 当您从浏览器调试时,您肯定可以只查看没有 HTML 元素的 JSON 的页面源代码吗?
  • 当然可以,但是所有代码都在一行中,如果不包含在
     标签内,则很难阅读。
  • &lt;pre&gt; 只是以与源相同的格式布置响应(因此防止从浏览器格式化)。我的建议是,当您看到 JSON 的单行时,您可以在浏览器中转到 View -> Developer -> View Source 以查看原始输出(也就是 &lt;pre&gt; 的相同格式)你)
  • 这只是我不想采取的另一个不必要的步骤,并且不能解决我想要完成的事情。我知道有可能有 DOM 元素并且仍然可以工作,结帐api.randomuser.me ...他们的代码既已格式化又可在 Apps JSON 请求中使用。

标签: php ios json xcode


【解决方案1】:

不可能在 JSON 文档中创建任意 DOM 元素。这样做会导致 JSON 无效。

您在 cmets (api.randomuser.me) 中提供的链接没有定义任何 DOM 元素本身 - 而是发送一个 HTTP Content-Type 标头来指示浏览器内容是 JSON , 不是 HTML。然后,浏览器足够智能,可以很好地格式化输出,添加一些基本的 DOM 元素并将 JSON 放入 &lt;pre&gt; 中。

您可以通过添加 header('Content-Type: application/json; charset=utf-8') 来覆盖默认 HTTP Content-Type 来调用此行为:

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

$dataMult = array(
    "results" => array(
        array(
            "user" => array(
                "firstname" => "jerry",
                "lastname" => "barman",
                "username" => "yellowbear927",
                "street" => "2507 valley view ln",
                "thumbnail" => "https://randomuser.me/api/portraits/thumb/women/84.jpg",
                "rate" => "9.00"
            )
        )
    )
);

echo json_encode($dataMult, JSON_PRETTY_PRINT);?>

有关header()的更多信息

【讨论】:

  • 我不知道为什么我没有想到这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多