从 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 的页面源代码吗? 当然可以,但是所有代码都在一行中,如果不包含在标签内,则很难阅读。
<pre>
只是以与源相同的格式布置响应(因此防止从浏览器格式化)。我的建议是,当您看到 JSON 的单行时,您可以在浏览器中转到 View -> Developer -> View Source 以查看原始输出(也就是 <pre>
的相同格式)你)
这只是我不想采取的另一个不必要的步骤,并且不能解决我想要完成的事情。我知道有可能有 DOM 元素并且仍然可以工作,结帐api.randomuser.me ...他们的代码既已格式化又可在 Apps JSON 请求中使用。
【参考方案1】:
不可能在 JSON 文档中创建任意 DOM 元素。这样做会导致 JSON 无效。
您在 cmets (api.randomuser.me) 中提供的链接没有定义任何 DOM 元素本身 - 而是发送一个 HTTP Content-Type
标头来指示浏览器内容是 JSON , 不是 HTML。然后,浏览器足够智能,可以很好地格式化输出,添加一些基本的 DOM 元素并将 JSON 放入 <pre>
中。
您可以通过添加 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 标签 [关闭]