【发布时间】: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。