用方括号括起来时 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 的答案似乎对您不起作用的原因。您可以使用curlwget 发出与您的应用相同的请求,并在此处发布包含标题的响应吗? 我的错,由于某种原因,它不喜欢我为参数发送一个空字典,而宁愿我完全省略参数。您评论的答案现在有效!如果您将其发布为正确答案,我会为您接受。

以上是关于用方括号括起来时 JSON 作为原始字符串?的主要内容,如果未能解决你的问题,请参考以下文章

C# Regex.Split,如何将字符串拆分为用括号括起来而不是用括号括起来?

类型而不是变量之间的脱字符号,用括号括起来

使用RegEx通过转义获取用大括号括起来的字符串

为啥内置属性指令用方括号括起来?

基础-Ajax,json

复制用大括号括起来的文本