【问题标题】:My JSON decoder is not working and I'm not sure why我的 JSON 解码器不工作,我不知道为什么
【发布时间】:2019-04-12 12:18:24
【问题描述】:

我正在尝试访问一个名为“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","数量":"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 }

【问题讨论】:

  • 显示您访问数据的尝试。但首先,将do/catch 内的try? 更改为try,您在catch 内执行print(error)。然后你会知道任何错误而不是忽略它。
  • 您的block 内容似乎是双重编码的,这经常出现在由糟糕的服务器端工程师设计的 API 中。告诉服务器端工程师让 API 返回一个非双编码的 JSON。或者您可能需要将其解码为字符串并将其重新解码为 JSON。
  • 你现在可以编写一个自定义的初始化解码器来处理它或者更好地改变你的响应
  • 如果没有错误,那么问题是什么?并且只打印error,而不是error.localizedDescription。你会看到更多细节。
  • 你尝试了什么?告诉服务器端工程师什么?我已经提议重新解码,没有什么比 cast to Any 或 AnyObject。

标签: json swift decodable


【解决方案1】:

基本上是为了访问嵌套的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 的值转换为模型中的字符串。

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"

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 2020-02-20
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多