Мой JSON-декодер не работает, и я не уверен, почему - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь получить доступ к вложенной переменной JSON, которая называется 'block', но я не могу получить к ней доступ ни одним из способов, которые я пробовал.Вот пример JSON сообщение и мой код:

{ "счет": "xrb_34tsctqcgctm8fhnpat351z4f64rgz8o9y7gwh1dutjf1r7iiwfzruawhatz", "хэш": "E5935C559748444D09E97D6D13FDB48B51F46A01FA9F6FB2DBD3576D684A53C6", "блок": "{\ п \" типа \ ": \"состояние \", \ п \ "учетная запись \": \ "xrb_34tsctqcgctm8fhnpat351z4f64rgz8o9y7gwh1dutjf1r7iiwfzruawhatz \", \ п \ "предыдущая \": \ "78446816869EEEF4BC735B1A21AB33ED246A10303B87F0CAFD7CCD56406E0456 \", \ п \ "представитель \": \ "xrb_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh \", \ п \"баланс \": \ "320000000000000000000000000 \", \ п \ "ссылка \": \ "8DE4EE799910E26C5E44CDD345B8C8070E1955284BC407660825B425FBEDBB6B \", \ п \ "link_as_account \": \ "xrb_35h6xswsk694fjh6bmgmapwei3rg57ckiky61xm1ibfn6qxyugud9eo1fauk \", \ п \ "подписи \": \ "E4AF5BBDF583509DF3147004AB61FEC04F9007AC23A46A2E2E5BE4B65D0788F45F89EEC7B62D0F42144A9F5EA090EF3F58262070F07C59F1AD752B5CC3BF9D04\ ", \ n \" work \ ": \" a56cb9e8d2539f73 \ "\ n} \ n", "amount": "1`

struct IncomingBlock: Decodable {
    var account: String
    var hash: String

    struct Block: Decodable {
        var type: String
        var previous: String
        var link: String
        var link_as_account: String
        var representative: String
        var account: String
        var balance: String
        var work: String
        var signature: String
    }

    var block: Block
}

// in another file
guard let data = msg.data(using: .utf8) else { return }
guard let incomingBlock = try?JSONDecoder().decode(IncomingBlock.self, from: data) else { return }

1 Ответ

1 голос
/ 12 апреля 2019

По существу, для доступа к вложенной переменной JSON block Мне пришлось декодировать исходное сообщение JSON

do{
  guard let data = inital_msg.data(using: .utf8) else { return }
  let incomingBlock = try JSONDecoder().decode(IncomingBlock.self, from: data) 
catch ...{}

и значение block приведено к String в модели.

struct IncomingBlock: Decodable {
var account: String
var hash: String
var block: String
}

После этого я расшифровал поле начальных сообщений block еще раз, вот так

// Второй JSON

let json = incomingBlock.block.data(using: .utf8)!

наконец, с моделью разделенных блоков:

 struct BlockMeta: Decodable {
    var type: String
    var previous: String
    var link: String
    var link_as_account: String
    var representative: String
    var account: String
    var balance: String
    var work: String
    var signature: String
 }

Я мог получить доступ к полям

 let block = try JSONDecoder().decode(BlockMeta.self, from: json)
 block.balance //returns "320000000000000000000000000"
...