用方括号括起来时 JSON 作为原始字符串?
Posted
技术标签:
【中文标题】用方括号括起来时 JSON 作为原始字符串?【英文标题】:JSON as raw string when enclosed within square brackets? 【发布时间】:2019-07-10 08:22:33 【问题描述】:注意:这个问题现在完全没有意义,因为事实证明,我想要实现的目标实际上是可以使用我原来的方法实现的。实际上只是我发送了一个导致问题的空参数集。不过,也许某个地方的某个人可能会发现建议的其他方法之一有用,所以我将把它留在这里。
我一直在使用以下代码 sn-p 将 JSON 转换为完美的原始字符串,以便用大括号括起来:
AF.request("https://blahblah.com", method: .get, parameters: [:], encoding:JSONEncoding.default, headers: headers)
.responseJSON response in
guard let data = response.data else return
let json = try? JSON(data:data)
if let jsonAsString = json?.rawString()
self.consoleWindow.stringValue += jsonAsString
当 JSON 包含在这样的大括号中时,这很有效:
"blah1": true,
"blah2": "ABCDEF",
"blah3": "12345"
但是,我现在收到的 JSON 包含在方括号中,如下所示:(编辑:不一定总是 3 个元素,需要是通用解决方案)
[
"blah1": true,
"blah2": "ABCDEF",
"blah3": "12345"
]
当我使用我原来的方法时,我只是得到一个空字符串。
我是 JSON 和 SwiftyJSON 的新手,所以我不确定方括号如何改变 JSON 的结构。如何像使用大括号 JSON 一样将方括号 JSON 输出为原始字符串?
编辑:在某些情况下,我正在尝试创建一个控制台窗口之类的东西,它将输出任何格式的 JSON,具有任意数量的元素。
【问题讨论】:
【参考方案1】:如果您只是想获取服务器响应的字符串表示形式,请执行以下操作:
AF.request("https://blahblah.com", method: .get, parameters: [:], encoding:JSONEncoding.default, headers: headers)
.responseJSON response in
guard
let data = response.data,
let string = String(bytes: data, encoding: .utf8)
else
return
self.consoleWindow.stringValue += string
如果您需要将接收到的数据解析为模型对象,我建议您使用 swift 的内置 Codable
而不是 SwiftyJSON。
let json = """
[
"blah1": true,
"blah2": "ABCDEF",
"blah3": "12345"
]
""".data(using: .utf8)!
struct Bla: Codable
let blah1: Bool
let blah2: String
let blah3: String
do
// use [Bla].self to decode an array, or Bla.self for a single instance
let bla = try JSONDecoder().decode([Bla].self, from: json)
print(bla)
catch
print(error)
最后,我还建议您考虑一下为什么需要 Alamofire。恕我直言,使用 URLSession/URLSessionDataTask 并没有那么复杂,并且具有较少的 3rd 方依赖项几乎总是一个优点。
【讨论】:
JSON 可能并不总是采用那种精确的格式,我只想打印出作为原始字符串接收到的任何 JSON。此解决方案是否适用于方括号内的任何 JSON 或仅适用于该格式的 JSON?对不起,如果这是一个愚蠢的问题,但我不熟悉 JSON。 那么,为什么不直接打印响应数据呢?类似let string = String(bytes: data, encoding: .utf8)
我现在得到的字符串只是一个不包含任何 JSON 的 html 负载。也许我错误地添加了您的更改。您能否提供一个包含您所做更改的代码的答案,以查看我是否正确调整了原始代码?
如果您收到 HTML 作为响应,则需要修复您的服务器。这也是@kamrans 的答案似乎对您不起作用的原因。您可以使用curl
或wget
发出与您的应用相同的请求,并在此处发布包含标题的响应吗?
我的错,由于某种原因,它不喜欢我为参数发送一个空字典,而宁愿我完全省略参数。您评论的答案现在有效!如果您将其发布为正确答案,我会为您接受。以上是关于用方括号括起来时 JSON 作为原始字符串?的主要内容,如果未能解决你的问题,请参考以下文章