2016-10-17 1 views
0

と、にJSONをデシリアライズするための構造体を作成するのですがどのようにして、例えばにこれをデシリアライズするための構造体を作成することができどのように私は、マルチレベルのノード

{ 
    "kind": "Listing", 
    "data": { 
     "children": { 
      "domain": "twitlonger.com", 
      "other": "blahblah" 
     }, 
     "children": { 
      "domain": "Otherplace.com", 
      "other": "blahblah" 
     } 
    } 
} 

例えば、私は、このJSONを考えてみましょう

-Psuedoは私がちょうどすべての情報は、素晴らしいのおかげだろう

type JSONResp struct { 
    Kind string 
    Data []children 
} 

type children struct { 
    Domain string 
    Other string 
} 

を行うことができるだろうGolangから来ている

struct JSONResp { 
    let kind:String 
    let data:[String: Any] { 
     let children:[String: Any] { 
      let domain:String 
      let other:String 
     }   
    } 
} 

extension JSONResp { 
    init?(json: [String: Any]) { 
     // Deserialize my stuff 
    } 
} 

をコード - 。

これまで私がこれまでに作ったことは、私はそれが正しいかどうか分かりません。ちょうどちょっと私の本能が私に教えてくれています。所与JSONについて

import Foundation 

struct Subreddit { 
    let kind:String 
    let data:[Data] 

} 

struct Data { 
    let modhash:String 
    let children:[Children] 
} 

struct Children { 
    let kind:String 
    let data:[Payload] 
} 

struct Payload { 
    let contest_mode:Bool 
    let banned_by:NSNull 
    let domain:String 
    let subreddit:String 
    let selftext_html:String 
    let selftext:String 
    let likes:NSNull 
    let suggested_sort:NSNull 
    let saved:Bool 
    let id:String 
    let gilded:Int 
    let clicked:Bool 
    let author:String 
    let name:String 
    let score:Int 
    let over_18:Bool 
    let hidden:Bool 
    let thumbnail:String 
    let subreddit_id:String 
    let link_flair_css_class:String 
    let author_flair_css_class:String 
    let permalink:String 
    let Preview:[Preview] 
    let locked:Bool 
    let stickied:Bool 
    let created:Float64 
    let url:String 
    let author_flair_text:String 
    let quarantine:Bool 
    let title:String 
    let created_utc:Float64 
    let link_flair_text:String 
    let num_comments:UInt32 
    let visited:Bool 
    let ups:UInt32 
} 

struct Preview { 
    let images:[Images] 
} 

struct Images { 
    let source:[String:Any] 
    let resolutions:[String:Any] 
    let id:String 
} 

extension Subreddit { 
    init?(json: [String: Any]) { 

    } 
} 
+0

[SwiftyJSON(https://github.com/SwiftyJSON/SwiftyJSON)が推奨される –

+0

含まれていない場合

初期化が失敗します質問を助けるが、私はそれが著者*を助けるかもしれないと思った。私はそれを広範囲に使う。それは遅くて面倒でもありません... –

答えて

0

2つの構造体ChildJSONRespを宣言する。確かにそれはdoesnのkinddatachildrenの値のいずれかが

struct Child { 
    let domain : String 
    let other : String 
} 

struct JSONResp { 
    let kind : String 
    var children = [Child]() 

    init?(json: [String: Any]) { 
    guard let kind = json["kind"] as? String, 
     let data = json["data"] as? [String:Any], 
     let kids = data["children"] as? [[String:Any]] else { 
     return nil 
    } 
    self.kind = kind 
    for child in kids { 
     if let domain = child["domain"] as? String, 
     let other = child["other"] as? String { 
     children.append(Child(domain: domain, other: other)) 
     } 
    } 
    } 
} 
+0

質問のみ? 'Child'構造体にも' init?(json:_) 'を実装しないのはなぜですか? –

+0

@ LucaD'Alberti 'Child'は' JSONResp'に強く依存するためです。 – vadian

+0

ええ、それは意味があります:) –