如何处理从JSON返回的Null

时间:2017-01-14 13:54:04

标签: ios json swift

我有一个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

2 个答案:

答案 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。

顺便说一下,在公认的解决方案中,如果密钥为零,那么你的功能也会失败。