如何在 Swift 中格式化 JSON 字符串?

Posted

技术标签:

【中文标题】如何在 Swift 中格式化 JSON 字符串?【英文标题】:How to format a JSON String in Swift? 【发布时间】:2016-08-17 23:02:53 【问题描述】:

我有一个 JSON 字符串,其格式类似于 name: "John" 而不是 "name" : "John",每当我尝试访问名称键时都会导致结果为零,因为:

Error Domain=NSCocoaErrorDomain Code=3840 "No string key for value in object around character 1."

我正在寻找一个可以将这个 JSON 文件修复/解析/格式化为可读的函数? JSON Format 这样的网站是怎么做到的?

【问题讨论】:

你可以先责怪字符串创建者 ;-) JSON 字符串是否只是在 String 类型的变量中? @OlivierWilkinson 是的,它是一个字符串类型的变量。 检查这个。 ***.com/a/15265780/291240 @WilliamHu 我之前查过。我无法从 JSON Lint 等网站复制粘贴经过验证的字符串,我需要通过一种方法将该字符串转换为可读/有效的内容。 【参考方案1】:

有趣的是, name: "John" javascript 中创建了一个有效的 JSON 对象。所以你的问题现在变成了为 Swift 寻找一个 Javascript 解释器!

Mac OS X 和 ios 的最新版本内置了一个:WKWebView。它是一个带有 Javascript 解析器的网络渲染引擎。将您的目标与 WebKit 链接并尝试以下操作:

import WebKit

class MyJSONParser 
    private static let webView = WKWebView()

    class func parse(jsonString: String, completionHandler: (AnyObject?, NSError?) -> Void) 
        self.webView.evaluateJavaScript(jsonString, completionHandler: completionHandler)
    

用法:

let str = " firstName: 'John', lastName: 'Smith' "

// You must assign the JSON string to a variable or the Javascript
// will return void. Note that this runs asynchronously
MyJSONParser.parse("tmp = \(str)")  result, error in
    guard error == nil else 
        print(error)
        return
    
    if let dict = result as? [String: String] 
        print(dict)
     else 
       print("Can't convert to Dictionary")
    

斯威夫特 3

import WebKit
class MyJSONParser 
    private static let webView = WKWebView()

    class func parse(jsonString: String, completionHandler: @escaping (Any?, Error?) -> Void) 
        self.webView.evaluateJavaScript(jsonString, completionHandler: completionHandler)
    


let str = " firstName: 'John', lastName: 'Smith' "

// You must assign the JSON string to a variable or the Javascript
// will return void. Note that this runs asynchronously
MyJSONParser.parse(jsonString: "tmp = \(str)")  result, error in
    guard error == nil else 
        print(error!)
        return
    
    if let dict = result as? [String: String] 
        print(dict)
     else 
        print("Can't convert to Dictionary")
    

【讨论】:

当我在 Playground 中尝试时,什么都没有打印出来。这是screenshot。

以上是关于如何在 Swift 中格式化 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中加粗来自 JSON 的字符串的一部分?

Swift下面字典(json)和模型的转换

如何在 swift 3 中使用 Alamofire 制作和发送字典数组(JSON 格式)发送到服务器

如何让 JSON 中的日期格式在 ruby 与 Swift 间保持一致

如何让 JSON 中的日期格式在 ruby 与 Swift 间保持一致

在 Swift 中将字符串转换为 JSON 字符串