首页 > 解决方案 > 我的 JSON 解码器不工作,我不知道为什么

问题描述

我正在尝试访问一个名为“block”的嵌套 JSON 变量,但我似乎无法以我尝试过的任何方式访问它。这是一个示例 JSON 消息和我的代码:

{"account":"xrb_34tsctqcgctm8fhnpat351z4f64rgz8o9y7gwh1dutjf1r7iiwfzruawhatz","hash":"E5935C559748444D09E97D6D13FDB48B51F46A01FA9F6FB2DBD3576D684A53C6","block":"{\n \"type\": \"state\",\n \"account\": \"xrb_34tsctqcgctm8fhnpat351z4f64rgz8o9y7gwh1dutjf1r7iiwfzruawhatz\" ,\n \"previous\": \"78446816869EEEF4BC735B1A21AB33ED246A10303B87F0CAFD7CCD56406E0456\",\n \"representative\": \"xrb_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh\",\n \"balance\": \"320000000000000000000000000\",\n \"link\" : \"8DE4EE799910E26C5E44CDD345B8C8070E1955284BC407660825B425FBEDBB6B\",\n \"link_as_account\": \"xrb_35h6xswsk694fjh6bmgmapwei3rg57ckiky61xm1ibfn6qxyugud9eo1fauk\",\n \"signature\": \"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 }

标签: jsonswiftdecodable

解决方案


基本上要访问嵌套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"

推荐阅读