我有一个JSON
可能包含某些键值的null
值。
这是我的代码:
static func parseJSONString(jsonString: String?, key: String?) -> () -> String{
var jsonSubString: String?
func parseString() -> String{
if let data = jsonString?.data(using: .utf8){
if let content = try? JSONSerialization.jsonObject(with: data, options: []),
let array = content as? [[String: AnyObject]]
{
for jsondict in array {
if let jsondictOptional = jsondict[key!]{
jsonSubString = (jsondictOptional as? String)
}
else {
jsonSubString = " "
}
}
}
}
return jsonSubString!
}
return parseString
}
当我运行应用程序时,它会崩溃。如何成功运行此代码,以便我甚至可以处理从JSON返回的nulls
?
答案 0 :(得分:1)
崩溃的原因是你强行打开一个可选项。如果可选项为nil
,则会导致应用程序崩溃。你可以通过让函数返回一个可选的String
而不是强制解包它,或者在它String
时返回一个空的nil
来修复它。
static func parseJSONString(jsonString: String?, key: String?) -> () -> String? {
var jsonSubString: String?
func parseString() -> String{
if let data = jsonString?.data(using: .utf8){
if let content = try? JSONSerialization.jsonObject(with: data, options: []),
let array = content as? [[String: AnyObject]]
{
for jsondict in array {
if let jsondictOptional = jsondict[key!]{
jsonSubString = (jsondictOptional as? String)
}
else {
jsonSubString = " "
}
}
}
}
// Don't force unwrap this
// You could use `return jsonSubString ?? ""` if you want an empty string if the value is null
return jsonSubString
}
return parseString
}
答案 1 :(得分:0)
我真的不明白,为什么你想要这样的东西。我的意思是,您只从JSON数组中获取相应键的最后一个值。为什么你的密钥是可选的。为什么你会返回一个闭包而不是值。但是我根据原来的帖子行为修复了你的例子,只是没有崩溃:
extension Dictionary {
subscript(key: Key?) -> Value? {
return key.flatMap { self[$0] }
}
}
public func cast<Type, Result>(_ value: Type) -> Result? {
return value as? Result
}
typealias JSONArray = [[String: AnyObject]]
func toJSONArray(x: Any) -> JSONArray? {
return cast(x)
}
let json = "[{\"value\":\"1\"}, {\"value\":null}]"
func parseJSONString(jsonString: String?, key: String?) -> () -> String {
return {
jsonString?.data(using: .utf8)
.flatMap { try? JSONSerialization.jsonObject(with: $0, options: []) }
.flatMap(toJSONArray)
.flatMap { xs in
xs.flatMap { $0[key] }
}
.flatMap { cast($0.last) }
?? ""
}
}
let a = parseJSONString(jsonString: json, key: "value")()
print(a)
您可以从IDPCastable cocoapod获取演员表功能。您应该阅读有关type inference的更多信息。
为了使平面图更容易酿造,请查看SwiftZ cocoapod。
顺便说一下,在公认的解决方案中,如果密钥为零,那么你的功能也会失败。