2017-01-02 6 views
1

私は下のJSONからオブジェクトを作成するのに苦労しています。それは不気味=;でフォーマットされますが、それはコンソールに出力するとき、それはどのように見えるかです:文字列ではなく数字で始まるJSON辞書からオブジェクトを正しく作成するにはどうすればよいですか?

result =  (
    { 
media =    { 
     image =     { 
      1000 = "/assets/img/cities/basel-switzerland-1000px.jpg"; 
      1500 = "/assets/img/cities/basel-switzerland-1500px.jpg"; 
      250 = "/assets/img/cities/basel-switzerland-250px.jpg"; 
      500 = "/assets/img/cities/basel-switzerland-500px.jpg"; 
     }; 
     }; 
} 
) 

私はカスタムオブジェクトを作成しましたが、私は

EXC_BAD_INSTRUCTION

エラーを得続けるが、私は "のため[Int: Any]を使用するとき画像」とするとき、私は代わりにNSNumberに置き換えて、私はエラーを取得する:ここで

Could not cast value of type 'NSTaggedPointerString' (0x10ee4ad10) to 'NSNumber' (0x10bc88488).

は私のためにカスタムクラスでありますJSONオブジェクト:

class sampleJSON { 
    var mediaDictionary: [String: Any] 
    var imageDictionary: [Int: Any] 
    var image: URL 

    init(mediaDictionary: [String: Any], imageDictionary: [Int: Any], image: URL){ 
    self.mediaDictionary = mediaDictionary 
    self.imageDictionary = imageDictionary 
    self.image = image 
    } 

    init(resultsDictionary:[String: Any]){ 
    mediaDictionary = (resultsDictionary["media"] as? [String: Any])! 
    imageDictionary = (mediaDictionary["image"] as? [Int: Any])! 
    image = URL(string: imageDictionary[1000] as! String)! 
    } 

これは私がJSONデータを解析しています方法です:

static func downloadAllData(urlExtension: String, completionHandler: @escaping (sampleJSON?) ->()) { 
    let usm = UrlSessionNetworkManager.sharedManager 

    if let jsonDictionary = usm.parseJSONFromData(urlExtension:"\(urlExtension)") 
    { 
     let resultDictionaries = jsonDictionary["result"] as! [[String : Any]] 
     for resultsDictionary in resultDictionaries {// enumerate through dictionary 
     let nomadInfo = sampleJSON(resultsDictionary: resultsDictionary) 

     print(nomadInfo.mediaDictionary) 

     completionHandler(nomadInfo) 
     } 
    } else { 
     print("Error: Cannot retrieve JSON Data") 
    } 
    } 
} 
+1

「数字」でも、 JSONのause辞書キーは文字列です。強制ダウンキャストを使用していますが、例外がスローされます。ダウンキャストを使わずにデバッガを調べて、あなたが実際に扱っているものを見てください。あなたが制御しないデータ(つまり、WebサーバーからのJSONデータ)で強制ダウンキャストまたは強制アンラップを使用すると、クラッシュが要求されます。条件付きキャスト/アンラッピングを使用し、より上手く解析エラーを処理します – Paulw11

+0

これは常にJSONの辞書キーであれば、それは常に文字列です。 – SwiftyJD

+0

キー値はどうですか?文字列以外のオブジェクトではありませんか? – SwiftyJD

答えて

0

も、[String: Any][Int: Any]のすべての出現箇所を交換して、サーバコードでその変更を行います。 As mentioned by @Paulw11, JSON keys can only be strings (but a value can be a string in double quotes, or a number, or true or false or null, or an object or an array)。また、言及したように、(a as? b)!を使用せず、代わりにa as! bを使用してください。

新しい(そして今、有効な)JSON 次のようになります。

result =  (
    { 
media =    { 
     image =     { 
      "1000" = "/assets/img/cities/basel-switzerland-1000px.jpg"; 
      "1500" = "/assets/img/cities/basel-switzerland-1500px.jpg"; 
      "250" = "/assets/img/cities/basel-switzerland-250px.jpg"; 
      "500" = "/assets/img/cities/basel-switzerland-500px.jpg"; 
     }; 
     }; 
} 
) 

カスタムクラスは次のようになります。

class sampleJSON { 
    var mediaDictionary: [String: Any] 
    var imageDictionary: [String: Any] 
    var image: URL 

    init(mediaDictionary: [String: Any], imageDictionary: [String: Any], image: URL){ 
    self.mediaDictionary = mediaDictionary 
    self.imageDictionary = imageDictionary 
    self.image = image 
    } 

    init(resultsDictionary:[String: Any]){ 
    mediaDictionary = resultsDictionary["media"] as! [String: Any] 
    imageDictionary = mediaDictionary["image"] as! [String: Any] 
    image = URL(string: imageDictionary["1000"] as! String)! 
    } 

と解析機能は無関係の、ほんの少し(でなければなりません固定番号問題):

static func downloadAllData(urlExtension: String, completionHandler: @escaping (sampleJSON?) ->()) { 
    let usm = UrlSessionNetworkManager.sharedManager 

    if let jsonDictionary = usm.parseJSONFromData(urlExtension: urlExtension) 
    { 
     let resultDictionaries = jsonDictionary["result"] as! [[String : Any]] 
     for resultsDictionary in resultDictionaries {// enumerate through dictionary 
     let nomadInfo = sampleJSON(resultsDictionary: resultsDictionary) 

     print(nomadInfo.mediaDictionary) 

     completionHandler(nomadInfo) 
     } 
    } else { 
     print("Error: Cannot retrieve JSON Data") 
    } 
    } 
} 
+0

これは今、あなたの助けに感謝します! – SwiftyJD

+0

これらの '!'はすべて、起こるのを待っているクラッシュです。彼らはすべて適切に対処する必要があります。 – rmaddy

+0

@rmaddyはい、私は全く同意しますが、これは古い方法より優れています。それは 'guard let x = y else {...}'文で行うべきですが、これはaskerまでです。 – Coder256

関連する問題