当用方括号括起来时,JSON作为原始字符串?
注意:这个问题现在完全没有意义了,因为事实证明,我想用我原来的方法实现的目标实际上是可能的。实际上是我发送了一个空的参数集导致了这些问题。不过,也许某处的人会发现其他建议的方法中的一种很有用,所以我将把它留在这里。 我一直在使用以下代码片段将JSON转换为原始字符串,这非常适合用花括号括起来的JSON:当用方括号括起来时,JSON作为原始字符串?,json,swift,alamofire,swifty-json,Json,Swift,Alamofire,Swifty Json,注意:这个问题现在完全没有意义了,因为事实证明,我想用我原来的方法实现的目标实际上是可能的。实际上是我发送了一个空的参数集导致了这些问题。不过,也许某处的人会发现其他建议的方法中的一种很有用,所以我将把它留在这里。 我一直在使用以下代码片段将JSON转换为原始字符串,这非常适合用花括号括起来的JSON: AF.request("https://blahblah.com", method: .get, parameters: [:], encoding:JSONEncoding.default,
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个元素,需要一个通用的解决方案)
当我使用我原来的方法时,我得到的只是一个空字符串
我不熟悉JSON和SwiftyJSON,所以我不确定方括号如何改变JSON的结构。如何将方括号内的JSON作为原始字符串输出,就像我使用方括号内的JSON一样
编辑:对于某些上下文,我试图创建一个类似控制台窗口的窗口,该窗口将输出任意格式的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内置的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实际上并没有那么复杂,第三方依赖性更少几乎总是一个优点,IMHO。JSON可能并不总是采用那种精确的格式,我只想将接收到的JSON作为原始字符串打印出来。此解决方案适用于方括号内的任何JSON,还是仅适用于该格式的JSON?抱歉,如果这是一个愚蠢的问题,但我不熟悉JSON。在这种情况下,为什么不直接打印响应数据?类似于
let string=string(bytes:data,encoding:.utf8)
我现在得到的字符串只是一堆不包含任何JSON的HTML。也许我添加的更改不正确。您是否可以提供一个包含代码的答案以及您所做的更改,以查看我是否正确地修改了原始代码?如果您得到的是HTML作为响应,则需要修复服务器。这也是@kamrans答案似乎不适合您的原因。你能使用curl
或wget
发出与你的应用程序相同的请求,并在此处发布包含标题的响应吗?我的错,出于某种原因,它不喜欢我发送一个空的参数字典,而宁愿我完全忽略参数。你的回答现在有效了!如果你把它作为一个正确的答案贴出来,我会为你接受的。
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)
}