如何使用Codable在Swift 4中解析复杂的JSON

twizted_klaun

我需要从服务器解析JSON的帮助。这是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)

我收到一个错误:

致命错误:“尝试!” 表达意外加一个错误:Swift.DecodingError.keyNotFound(_UL_PetrovLeonid.NewsItems(在_FA9A2FC8130449AA328C19ACD9506C2D).attachments CodingKeys,Swift.DecodingError.Context(codingPath:[在_FA9A2FC8130449AA328C19ACD9506C2D).response _UL_Leonid.ResponseNewsFeed(CodingKeys,_UL_PetrovLeonid.WhatIsIsideResponseNewsFeed( _FA9A2FC8130449AA328C19ACD9506C2D中的CodingKeys。项,基础。(_ 12768CA107A31EF2DCE034FD75B541C9中的_JSONKey)(字符串值:“索引0”,intValue:可选(0))],debugDescription:“与键附件(\”)无关联的值,“ \”。底层错误:无)

为什么会发生这种情况,我需要怎么做才能解决?从现在开始我只从事了三个月的编码工作,所以如果我的问题看起来很愚蠢,请事先谅解。

谢谢。

瓦迪安

错误信息很清楚

... Swift.DecodingError。keyNotFound ... NewsItems。(_ FA9A2FC8130449AA328C19ACD9506C2D中的CodingKeys)。附件...与关键附件(\“ attachments \”)没有关联的值

  • keyNotFound是缺少密钥
  • NewsItems。(CodingKeys ...).attachments是密钥的对象attachmentsNewsItems其中Attachments
  • 说的是与关键附件(\“ attachments \”)关联的值

不久:没有钥匙attachmentsAttachments哪个是真的。

看你的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.
}

实际上,不需要使用classes,在大多数情况下,astruct就足够了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用 Swift 创建 JSON Codable

使用 Codable 在 swift 4.2 中解析 Json

如何在 Swift 中使用 Codable 解析 JSON?

如何使用 Codable 解析 Json

如何在核心数据中使用swift 4 Codable?

如何使用Swift Codable处理部分动态JSON?

如何在swift4中从复杂的json解析并获取数据?

Swift 4中使用复杂和嵌套数据进行JSON解析

在Swift中使用Codable解析JSON响应

在 Swift 4 中,如何使用 Codable 解码 JSON 并在解码的对象之间创建引用?

使用Codable在Swift中解析字典数组

使用 swift 的 Codable 解码 JSON

Swift 4使用Codable解码json

如何在Haskell中解析复杂的JSON

如何使用 Codable 解析 SubReddits JSON

仅使用Swift 4 Codable解码JSON数据中的数组

如何使用Swift 4 Codable处理JSON格式不一致的内容?

如何从Swift 4的Codable中排除属性

如何使用C#在Unity中解析复杂的JSON对象

使用Swift 4的Codable进行类型转换

使用Swift 4 Codable PropertyListDecoder()解码PropertyList

如何使用 Codable 协议在 swift 中为同一结构使用 2 个编码密钥

Swift Codable:使用字典解析JSON?多个不同的条目?

在 iOS Swift 中使用 codable 解析嵌套的 json 响应数据?

如何使用 Swift 为 JSON 数据创建 JSON Codable 和 Decodable?

Swift 4 Codable;如何使用单个根级密钥解码对象

使用Swift Network Framework,如何使IPv4Address和IPv6Address符合Codable?

如何在Swift中使用Codable解码具有不同对象的JSON数组?

如何使用带有嵌套JSON结构和未知键的Swift Codable