当用方括号括起来时,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,

注意:这个问题现在完全没有意义了,因为事实证明,我想用我原来的方法实现的目标实际上是可能的。实际上是我发送了一个空的参数集导致了这些问题。不过,也许某处的人会发现其他建议的方法中的一种很有用,所以我将把它留在这里。

我一直在使用以下代码片段将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个元素,需要一个通用的解决方案)

当我使用我原来的方法时,我得到的只是一个空字符串

我不熟悉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)
}