我有一个遵循{ name: "John" }
而不是{ "name" : "John"}
格式的JSON字符串,每当我尝试访问名称密钥时都会产生nil,因为:
Error Domain=NSCocoaErrorDomain Code=3840 "No string key for value in object around character 1."
我正在寻找一个修复/解析/格式化这个JSON文件的函数?像JSON Format这样的网站如何做到这一点?
答案 0 :(得分:1)
有趣的是,{ name: "John" }
在Javascript中生成了一个有效的JSON对象。所以你现在的问题就是为Swift找到一个Javascript解释器!
最近版本的Mac OS X和iOS内置了一个:WKWebView
。它是一个带有Javascript解析器的Web呈现引擎。将您的目标与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")
}
}
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")
}
}