json - 我的 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 }
解决方案
基本上要访问嵌套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"
推荐阅读
- c# - 带有 for next 循环的 ObservableCollection
- delphi - 按顺序遍历Set
- java - tika 默认检测器对于不同应用程序中的相同代码是不同的
- html - 提高 Google Chrome 中滚动捕捉的灵敏度
- html - 在默认布局中注册时,带有 axios 请求的 Vue/Nuxt 组件未获取结果
- python - 使用python循环将数据插入sql表
- r - 安装 ComplexHeatmap 的问题。错误:包“集群”的编译失败
- lua - 如何为 wrk2 安装 Lua 模块(json、uuid 等)
- node.js - 当它们被不同的模块用作依赖项时,如何避免多次安装相同的node.js包?
- react-apollo - 将查询参数传递给 React Apollo POST 请求