从 JSON 请求中删除 DOM 标签

Posted

技术标签:

【中文标题】从 JSON 请求中删除 DOM 标签【英文标题】:remove DOM tags from a JSON request 【发布时间】: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 请求中使用。 【参考方案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()的更多信息

【讨论】:

我不知道为什么我没有想到这一点。谢谢!

以上是关于从 JSON 请求中删除 DOM 标签的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Laravel 中的响应 JSON 中删除 HTML 标签 [关闭]

如何从 JSON 响应中删除不需要的标签

如何使用 Simple HTML Dom Parser 从 HTML 中删除类和 ID 属性

从匹配特定键的 JSON 中删除所有值

使用适当的 GC 删除 DOM 节点(无泄漏)

如何从我没有修改的拉取请求中删除文件