2017-01-14 148 views
1

我有一個JSON,它可能包含某些鍵值的null值。如何處理從JSON返回的空值

這是我的代碼:

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

回答

1

崩潰的原因是你強制展開一個可選項。如果可選是nil它會使應用程序崩潰。您可以通過使函數返回可選String而不是強制解包它,或者在nil時返回一個空的String來解決此問題。

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 
    } 
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

爲了使flatmaps更可釀造檢查SwiftZ cocoapod。

順便說一句,在可接受的解決方案中,如果key爲零,你的函數也會失敗。