2017-12-29 29 views
1

サーバからJSONを解析する際に助けが必要です。ここではJSONです: "テキスト"、 "コメント"、 "reposts"、 "添付ファイル" "好き":Codableを使用してSwift 4で複雑なJSONを解析する方法

{ 
"response": { 
    "items": [ 
     { 
      "type": "post", 
      "source_id": -17507435, 
      "date": 1514538602, 
      "post_id": 4105, 
      "post_type": "post", 
      "text": "Some text here", 
      "marked_as_ads": 0, 
      "attachments": [ 
       { 
        "type": "photo", 
        "photo": { 
         "id": 456239655, 
         "album_id": -7, 
         "owner_id": -17507435, 
         "user_id": 100, 
         "photo_75": "https://sun1-3.userapi.com/c840632/v840632924/3b7e7/4YUS7DlaLK8.jpg", 
         "photo_130": "https://sun1-3.userapi.com/c840632/v840632924/3b7e8/Ffpb4ZUlulI.jpg", 
         "photo_604": "https://sun1-3.userapi.com/c840632/v840632924/3b7e9/-pkl6Qdb9hk.jpg", 
         "width": 439, 
         "height": 312, 
         "text": "", 
         "date": 1514538602, 
         "post_id": 4105, 
         "access_key": "6a61a49570efd9c39c" 
        } 
       } 
      ], 
      "post_source": { 
       "type": "api" 
      }, 
      "comments": { 
       "count": 0, 
       "groups_can_post": true, 
       "can_post": 1 
      }, 
      "likes": { 
       "count": 0, 
       "user_likes": 0, 
       "can_like": 1, 
       "can_publish": 1 
      }, 
      "reposts": { 
       "count": 0, 
       "user_reposted": 0 
      }, 
      "views": { 
       "count": 2 
      } 
     } 
    ], 
    "profiles": [], 
    "groups": [ 
     { 
      "id": 17507435, 
      "name": "Literature Museum", 
      "screen_name": "samlitmus", 
      "is_closed": 0, 
      "type": "group", 
      "is_admin": 0, 
      "is_member": 1, 
      "photo_50": "https://pp.userapi.com/c615722/v615722068/e58c/d5Y8E_5689s.jpg", 
      "photo_100": "https://pp.userapi.com/c615722/v615722068/e58b/Hm05ga3x2J8.jpg", 
      "photo_200": "https://pp.userapi.com/c615722/v615722068/e589/yoG_DDalFII.jpg" 
     }, 
     { 
      "id": 27711883, 
      "name": "E:\\music\\melodic hardcore", 
      "screen_name": "e_melodic_hc", 
      "is_closed": 0, 
      "type": "page", 
      "is_admin": 0, 
      "is_member": 1, 
      "photo_50": "https://pp.userapi.com/c628220/v628220426/47092/xepNnC7pSBw.jpg", 
      "photo_100": "https://pp.userapi.com/c628220/v628220426/47091/uAokr-c3NQ8.jpg", 
      "photo_200": "https://pp.userapi.com/c628220/v628220426/4708f/eNY4vzooz4E.jpg" 
     }, 
     { 
      "id": 81574241, 
      "name": "DOS4GW.EXE", 
      "screen_name": "dos4gw", 
      "is_closed": 0, 
      "type": "page", 
      "is_admin": 0, 
      "is_member": 1, 
      "photo_50": "https://pp.userapi.com/c622118/v622118651/e045/vlhV6QxtoLI.jpg", 
      "photo_100": "https://pp.userapi.com/c622118/v622118651/e044/P9mVUhXBV58.jpg", 
      "photo_200": "https://pp.userapi.com/c622118/v622118651/e043/Soq8oxCMB0I.jpg" 
     }, 
     { 
      "id": 76709587, 
      "name": "Prosvet", 
      "screen_name": "prosvet_pub", 
      "is_closed": 0, 
      "type": "page", 
      "is_admin": 0, 
      "is_member": 0, 
      "photo_50": "https://pp.userapi.com/c630431/v630431500/b24a/GHox8AmDTXU.jpg", 
      "photo_100": "https://pp.userapi.com/c630431/v630431500/b249/H3mcC-K7htM.jpg", 
      "photo_200": "https://pp.userapi.com/c630431/v630431500/b248/9fyvB8gkcwc.jpg" 
     } 
    ], 
    "next_from": "1/4105_1514494800_5" 
} 

}私はこのJSONから取得する必要がありますどのような

は線です。

「添付ファイル」フィールドの内側に「photo_604」という行を入力します。ここで

は私のコードです:

class NewsItems: Decodable { 
    var text: String? 
    var comments: Comments 
    var likes: Likes 
    var reposts: Reposts 
    var attachments: [Attachments] 
} 

class Comments: Decodable { 
    var count: Int? 
} 

class Likes: Decodable { 
    var count: Int? 
} 

class Reposts: Decodable { 
    var count: Int? 
} 

class Attachments: Decodable { 
    var attachments: AttachmentPhoto 
} 

class AttachmentPhoto: Decodable { 
    var photo: WhatIsInsideAttachmentsPhoto 
} 

class WhatIsInsideAttachmentsPhoto: Decodable { 
    var photo: String? 

    enum CodingKeys: String, CodingKey { 
     case photo = "photo_604" 
    } 
} 


class WhatIsIsideResponseNewsFeed: Decodable { 
    var items: [NewsItems] 
} 

public class ResponseNewsFeed: Decodable { 
    var response: WhatIsIsideResponseNewsFeed 
} 

しかし、要求行った後:

Alamofire.request(baseURL+methodName, parameters: parameters).responseData(completionHandler: { response in 
     if let result = response.result.value { 
      let decoder = JSONDecoder() 
      let myResponse = try! decoder.decode(ResponseNewsFeed.self, from: result) 
      completion(myResponse.response.items) 

を私はエラーを取得:

Fatal error: 'try!' expression unexpectedly raised an error: Swift.DecodingError.keyNotFound(_UL_PetrovLeonid.NewsItems.(CodingKeys in _FA9A2FC8130449AA328C19ACD9506C2D).attachments, Swift.DecodingError.Context(codingPath: [_UL_Leonid.ResponseNewsFeed.(CodingKeys in _FA9A2FC8130449AA328C19ACD9506C2D).response, _UL_PetrovLeonid.WhatIsIsideResponseNewsFeed.(CodingKeys in _FA9A2FC8130449AA328C19ACD9506C2D).items, Foundation.(_JSONKey in _12768CA107A31EF2DCE034FD75B541C9)(stringValue: "Index 0", intValue: Optional(0))], debugDescription: "No value associated with key attachments (\"attachments\").", underlyingError: nil))

がなぜ起こっていることを、私はには何が必要ですそれを解決するには?私は今から3ヶ月しかコーディングしていないので、もし私の問題が愚かであれば、あらかじめ私に許してください。

ありがとうございます。

答えて

0

エラーメッセージが

... Swift.DecodingError.keyNotFound ... NewsItems.(CodingKeys in _FA9A2FC8130449AA328C19ACD9506C2D).attachments ... No value associated with key attachments (\"attachments\").

  • 非常に明確であるkeyNotFoundが鍵となります
  • のNewsItemが不足しています。(CodingKeys ...)を.attachments NewsItemsにどのキーattachmentsためのオブジェクトでありますはAttachments
  • キーアタッチメント(\ "a ttachments \ ")のことです。

まもなく:にはAttachmentsというキーはありません。あなたのJSONで

ルック

 "attachments": [ 
      { 
       "type": "photo", 
       "photo": { 

クラス相当

class Attachments: Decodable { 
    let type : String 
    let photo : AttachmentPhoto 
} 

そしてAttachmentPhotoですが

class AttachmentPhoto: Decodable { 

    private enum CodingKeys : String, CodingKey { 
     case photo604 = "photo_604" 
     case id 
    } 

    let id : Int 
    let photo604 : String // or even URL 
    // etc. 
} 

ことになっている実際class ESを使用する必要はありません、でほとんどの場合structで十分です。

+0

ありがとう、vadian、あなたの答えはエラーを解決しました! 私のような新人にとっては、そのようなことを見落とすのは簡単です。 –

関連する問題