Как сделать структуры для этого JSON с декодируемым протоколом? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть этот JSON:

{
    "$type": "DTOMapper.DTOResponseList`1[[Telemed.Dto.DTOTip, Telemed.Dto]], DTOMapper",
    "ResponseList": {
        "$type": "System.Collections.Generic.List`1[[Telemed.Dto.DTOTip, Telemed.Dto]], mscorlib",
        "$values": [
            {
                "$type": "Telemed.Dto.DTOTip, Telemed.Dto",
                "Title": "NO TE JUNTES CON LUQUITAS",
                "Text": "Porque si tenes un amigo lucas y otro amigo lucas, tenés dos lucas. Pero no te sirven para pagar nada",
                "GroupName": "TGC.Tips1",
                "ConfigurationPath": "TelemedGlobalConfig>Tips>Tips[0]"
            },
            {
                "$type": "Telemed.Dto.DTOTip, Telemed.Dto",
                "Title": "no te emborraches en las fiestas",
                "Text": "Terminarás pateando globos",
                "GroupName": "TGC.Tips2",
                "ConfigurationPath": "TelemedGlobalConfig>Tips>Tips[1]"
            }
        ]
    },
    "StatusCode": 200,
    "ErrorId": 0
}

И я пытаюсь получить доступ к Title и Text из массива $values.

Вот мои текущие структуры, но Root дает мне ошибки.

struct Root : Decodable {  // <<< Type 'Root' does not conform to protocol 'Decodable'
    private enum CodingKeys : String, CodingKey { case responseList = "ResponseList" }
    let responseList : ResponseList // <<< Use of undeclared type 'ResponseList'
}

struct Values : Decodable {
    private enum CodingKeys : String, CodingKey {
        case title = "Title"
        case text = "Text"
    }

    let title : String
    let text : String
}

Как правильно это сделать? Кроме того, я должен сделать struct и let для всего? Даже для вещей, которые я не буду использовать, как $type, GroupName?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Вы можете попробовать это:

struct YourStructName: Codable {
    var statusCode: Int
    var errorId: Int
    var type: String // Maybe make this an enum case
    var response: Response

    enum CodingKeys: String, CodingKey {
        case statusCode = "StatusCode"
        case errorId = "ErrorId"
        case type = "$type"
        case response = "ResponseList"
    }

    struct Response: Codable {
        var type: String // Again, consider making this an enum case
        var values: [ResponseValue]

        enum CodingKeys: String, CodingKey {
            case type = "$type"
            case values = "$values"
        }

        struct ResponseValue: Codable { 
            var title: String
            var text: String 

            enum CodingKeys: String, CodingKey { 
                case title = "Title"
                case text = "Text" 
            }
        }
    }
}
1 голос
/ 12 июня 2019

Как правильно это сделать?

do { 
    let res = try JSONDecoder().decode(Root.self, from: data) 
}
catch { 
    print(error)
}

struct Root: Codable {
    let type: String
    let responseList: ResponseList
    let statusCode, errorID: Int

    enum CodingKeys: String, CodingKey {
        case type = "$type"
        case responseList = "ResponseList"
        case statusCode = "StatusCode"
        case errorID = "ErrorId"
    }
}

// MARK: - ResponseList
struct ResponseList: Codable {
    let type: String
    let values: [Value]

    enum CodingKeys: String, CodingKey {
        case type = "$type"
        case values = "$values"
    }
}

// MARK: - Value
struct Value: Codable {
    let title, text:String // left only <<<  access to Title and Text
    enum CodingKeys: String, CodingKey {
        case title = "Title"
        case text = "Text"

    }
}

Должен ли я создать структуру и позволить для всего?Даже для вещей, которые я не буду использовать, например, $ type, GroupName?

Не только свойства, которые вы будете использовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...