如何从JSON响应中检索数据

时间:2019-02-26 07:52:00

标签: ios json swift

我正在尝试从json响应中获取数据,响应格式如下所述。我想获取“收件人”字典,并且需要显示在table.each单元格中,包含名称以及唯一的ID和图像。如何在本地词典中将这本词典翻译成故事?

{
    "success": 1,
    "status": 200,
    "data": {
        "chat": [

            {
                "id": 5,
                "status": 0,
                "created_at": "2019-02-19 13:29:15",
                "updated_at": "2019-02-19 13:29:15",
                "recipient": {
                    "id": 5,
                    "unique_id": "10004",
                    "name": "Pandu",
                    "avatar": "https://www.planetzoom.co.in/img/default_avatar_female.png"
                },
                "conversation": {
                    "id": 67,
                    "chat_id": 5,
                    "user_id": 4,
                    "type": 0,
                    "message": "I have sent a msg now",
                    "status": 0,
                    "created_at": "2019-02-26 04:02:20"
                }
            },
            {
                "id": 3,
                "status": 0,
                "created_at": "2019-02-19 13:17:49",
                "updated_at": "2019-02-19 13:17:49",
                "recipient": {
                    "id": 8,
                    "unique_id": "10007",
                    "name": "Mahitha",
                    "avatar": "https://www.planetzoom.co.in/storage/user/avatar/cZt9yQlBzIEewOdQ1lYZhl3dFiOv2k3bxG7HLOzR.jpeg"
                },
                "conversation": {
                    "id": 57,
                    "chat_id": 3,
                    "user_id": 4,
                    "type": 0,
                    "message": "Hi",
                    "status": 0,
                    "created_at": "2019-02-24 13:04:29"
                }
            },
            {
                "id": 2,
                "status": 0,
                "created_at": "2019-02-19 07:59:05",
                "updated_at": "2019-02-19 07:59:05",
                "recipient": {
                    "id": 1,
                    "unique_id": "1111",
                    "name": "Angadi World Tech",
                    "avatar": "https://www.planetzoom.co.in/storage/user/avatar/NlVzdUAfmLfIG9677szYZz7NkWyY4ULHAqnlCiiV.png"
                },
                "conversation": {
                    "id": 21,
                    "chat_id": 2,
                    "user_id": 4,
                    "type": 0,
                    "message": "Hi\\uD83D\\uDE0A",
                    "status": 0,
                    "created_at": "2019-02-21 10:35:26"
                }
            }
        ]
    }
}

2 个答案:

答案 0 :(得分:1)

我认为解码json的最佳方法是使用<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script> <p><input data-bind="value: myNumberOne, event: { change: myNumberOneChanged }" /> Textbox 1</p> <p><input data-bind="value: myNumberTwo, event: { change: myNumberTwochanged }" /> Textbox 2</p>

我创建了一些结构来表示数据并对其进行解码,请注意,此json无效,因此必须将其包装在Codable

这是json:

{}

以下是结构:

let jsonString = """
{
    "chat": [
    {
        "id": 12,
        "status": 0,
        "created_at": "2019-02-22 04:57:12",
        "updated_at": "2019-02-22 04:57:12",
        "recipient": {
            "id": 26,
            "unique_id": "10024",
            "name": "Kaverinew",
            "avatar": "https://www.planetzoom.co.in/storage/user/avatar/1PyI4ceM3zPsG1fxbfatktWUT75sOE2Ttah8ctIp.png"
        },
        "conversation": {
            "id": 65,
            "chat_id": 12,
            "user_id": 4,
            "type": 1,
            "message": "https://www.planetzoom.co.in/storage/chat/message/e759KWdSBegwXslAoS2xst0lohbbjNZMdpVnbxQG.png",
            "status": 0,
            "created_at": "2019-02-25 15:39:24"
        }
    },
    {
        "id": 6,
        "status": 0,
        "created_at": "2019-02-20 07:16:35",
        "updated_at": "2019-02-20 07:16:35",
        "recipient": {
        "id": 7,
        "unique_id": "10006",
        "name": "Hema",
        "avatar": "https://www.planetzoom.co.in/img/default_avatar_female.png"
    },
    "conversation": {
        "id": 44,
        "chat_id": 6,
        "user_id": 4,
        "type": 1,
        "message": "https://www.planetzoom.co.in/storage/chat/message/qJjOtCRcBKBuq3UKaKVuVOEIQhaVPeJr3Bd4NoLo.png",
        "status": 0,
        "created_at": "2019-02-22 10:17:49"
    }
}
]
}

这是解码方法:

struct Recipient: Codable {
    var identifier: Int
    var unique_id: Int
    var name: String
    var avatar: String

    enum CodingKeys: String, CodingKey {
        case identifier = "id"
        case unique_id = "unique_id"
        case name = "name"
        case avatar = "avatar"
    }

}

struct Conversation: Codable {
    var identifier: Int
    var chat_id: Int
    var user_id: Int
    var conversationType: Int
    var message: String
    var status: Int
    var created_at: String

    enum CodingKeys: String, CodingKey {
        case identifier = "id"
        case chat_id = "chat_id"
        case user_id = "user_id"
        case conversationType = "type"
        case message = "message"
        case status = "status"
        case created_at = "created_at"
    }
}

struct Chat: Codable {
    var identifier: Int
    var status: Int
    var created_at: String
    var updated_at: String

    enum CodingKeys: String, CodingKey {
        case identifier = "id"
        case status = "status"
        case created_at = "created_at"
        case updated_at = "updated_at"
    }

}

struct RootObject: Codable {
    var chats: [Chat]

    enum CodingKeys: String, CodingKey {
        case chats = "chat"
    }
}

答案 1 :(得分:0)

假设您已经有一个表示JSON的Data对象,则可以使用JSONSerialization将其转换为具体的Swift对象。完成此操作后,您只需要逐步操作并提取数据即可。像下面这样的东西应该很好用:

func retrieveRecipients(jsonData: Data?) throws -> [[String: Any]] {
    guard let data = jsonData else { throw NSError(domain: "Parsing Recipients", code: 404, userInfo: ["dev_message": "Null JSON data inserted"]) }
    guard let parsedJSON = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) else { throw NSError(domain: "Parsing Recipients", code: 500, userInfo: ["dev_message": "Data could not be parsed as JSON"]) }
    guard let object = parsedJSON as? [String: Any] else { throw NSError(domain: "Parsing Recipients", code: 500, userInfo: ["dev_message": "Parsed JSON is not a dictionary"]) }
    guard let items = object["chat"] as? [[String: Any]] else { throw NSError(domain: "Parsing Recipients", code: 404, userInfo: ["dev_message": "JSON is missing \"chat\" array"]) }

    return items.compactMap { $0["recipient"] as? [String: Any] }
}

这就是所有安全功能。否则,您可以很快完成此操作:

func retreiveRecipientsStrict(jsonData: Data?) -> [[String: Any]] {
    return ((try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String: Any])["chat"] as! [[String: Any]]).compactMap { $0["recipient"] as? [String: Any] }
}

但是如果出现错误,这将导致崩溃,并且调试出问题的地方将非常困难。