Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何处理JSON返回的Null_Ios_Json_Swift - Fatal编程技术网

Ios 如何处理JSON返回的Null

Ios 如何处理JSON返回的Null,ios,json,swift,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: .u

我有一个
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返回的
null

崩溃的原因是您正在强制展开可选的。如果可选设置为
nil
,则会使应用程序崩溃。您可以通过使函数返回可选的
字符串来修复它,而不是强制展开它,或者在
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
    }

我真的不明白,你为什么想要那样的东西。我的意思是,您只能从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)
扩展字典{
下标(键:键?->值{
return key.flatMap{self[$0]}
}
}
公共函数强制转换(u值:类型)->结果?{
返回值作为结果
}
typealias JSONArray=[[String:AnyObject]]
func-toJSONArray(x:Any)->JSONArray?{
回投(x)
}
让json=“[{\'value\':\'1\'},{\'value\':null}”
func parseJSONString(jsonString:String?,key:String?->()->String{
返回{
jsonString?.data(使用:.utf8)
.flatMap{try?JSONSerialization.jsonObject(带:$0,选项:[])}
.flatMap(toJSONArray)
.flatMap{xs in
xs.flatMap{$0[key]}
}
.flatMap{cast($0.last)}
?? ""
}
}
设a=parseJSONString(jsonString:json,key:value)()
印刷品(a)
您可以从中获得cast函数。你应该多读一些

为了使平面地图更易于制作,请查看SwiftZ cocoapod

顺便说一句,在公认的解决方案中,如果key为nil,您的函数也会失败