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,您的函数也会失败