有没有比我使用的更好的“漂亮打印”json 字符串的方法

Dmi*_*try 8 json pretty-print swift

我有 json 数据来自服务器端。

如果我使用下一个代码,我不会打印出漂亮的一行字符串:

print(String(bytes: jsonData, encoding: String.Encoding.utf8))
Run Code Online (Sandbox Code Playgroud)

为了使它打印得漂亮,我使用了下一个代码:

if let json = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) {
   if let prettyPrintedData = try? JSONSerialization.data(withJSONObject: json, options: .prettyPrinted) {
      print(String(bytes: prettyPrintedData, encoding: String.Encoding.utf8) ?? "NIL")
   }
}
Run Code Online (Sandbox Code Playgroud)

但似乎这不是最好的方法。

那么有人知道如何漂亮地打印传入的 jsonData 来打印它吗?

Har*_*ris 19

你所拥有的稍微漂亮的版本:

if let json = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers),
   let jsonData = try? JSONSerialization.data(withJSONObject: json, options: .prettyPrinted) {
    print(String(decoding: jsonData, as: UTF8.self))
} else {
    print("json data malformed")
}
Run Code Online (Sandbox Code Playgroud)


mnl*_*mnl 14

直接使用编码器上的输出格式化选项:

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可能会回答另一个问题,但这完全解决了我在谷歌上搜索的问题。 (4认同)

小智 10

基本上在 Swift 中存在两种类型的字符串:StringNSString

第二种是较旧的(甚至在 Objective-C 中也使用),现在更常使用较新的String类型。然而,NSString允许你漂亮地打印现有的字符串,这意味着 f.ex. 反斜杠将被自动删除。

从服务器接收到的 Json 数据

对于这种情况,我使用这样的助手:

extension Data {
    var prettyString: NSString? {
        return NSString(data: self, encoding: String.Encoding.utf8.rawValue) ?? nil
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 NSString 而不是 String 类型非常重要。

或者,您可以对 String 进行操作,但最终将其转换为 AnyObject,如下所示:

String(data: stringData, encoding: .utf8)! as AnyObject
Run Code Online (Sandbox Code Playgroud)

控制台中的结果如下所示(服务器响应的示例):

{
  "message" : "User could not log in",
  "errorCode" : "USER_COULD_NOT_LOG_IN",
  "parameters" : null
}
Run Code Online (Sandbox Code Playgroud)

现有字符串的漂亮字符串

要美化任何字符串,您可以使用上面的第二种方法,因此将 String 转换为 AnyObject。它还会让绳子看起来更好。F.例如:

let myStr: String = ...
print(myStr as AnyObject)
Run Code Online (Sandbox Code Playgroud)


Suh*_*til 5

斯威夫特 5 及以上

方便地将数据扩展为漂亮打印的 JSON

extension Data {
    
    func printJson() {
        do {
            let json = try JSONSerialization.jsonObject(with: self, options: [])
            let data = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
            guard let jsonString = String(data: data, encoding: .utf8) else {
                print("Inavlid data")
                return
            }
            print(jsonString)
        } catch {
            print("Error: \(error.localizedDescription)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用:

 let json = """
  {
    "id": 1,
    "name": "Steve Jobs",
    "username": "Steve",
    "email": "jobs@apple.com",
    "address": {
      "street": "Kulas Light",
      "suite": "Apt. 556",
      "city": "San Jose",
      "zipcode": "1234-5678"
    },
    "phone": "1-770-736-8031 x56442"
  }
"""

let jsonData = Data(json.utf8)
// log json data in pretty format
jsonData.printJson()
Run Code Online (Sandbox Code Playgroud)