JSON 作为原始字符串括在方括号中?
JSON as raw string when enclosed within square brackets?
注意:这个问题现在完全没有意义,因为事实证明,使用我原来的方法实际上可以实现我想要实现的目标。实际上只是我发送了一个导致问题的空参数集。尽管如此,也许某个地方的某个人可能会发现建议的其他方法之一有用,所以我会把它留在这里。
我一直在使用以下代码片段将 JSON 转换为完全适合 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 所做的那样?
编辑:对于某些上下文,我正在尝试创建类似控制台 window 的东西,它将输出任何格式的 JSON,包含任意数量的元素。
如果您只想获取服务器响应的字符串表示形式,请执行以下操作:
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 的 built-in 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 并没有那么复杂,更少的第 3 方依赖项几乎总是一个优势,恕我直言。
注意:这个问题现在完全没有意义,因为事实证明,使用我原来的方法实际上可以实现我想要实现的目标。实际上只是我发送了一个导致问题的空参数集。尽管如此,也许某个地方的某个人可能会发现建议的其他方法之一有用,所以我会把它留在这里。
我一直在使用以下代码片段将 JSON 转换为完全适合 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 所做的那样?
编辑:对于某些上下文,我正在尝试创建类似控制台 window 的东西,它将输出任何格式的 JSON,包含任意数量的元素。
如果您只想获取服务器响应的字符串表示形式,请执行以下操作:
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 的 built-in 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 并没有那么复杂,更少的第 3 方依赖项几乎总是一个优势,恕我直言。