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 方依赖项几乎总是一个优势,恕我直言。