要解码的JSON:
{
"jsonrpc": "2.0",
"result": [
{
"code": 1,
"message": "error"
},
[
{
"gid": "123"
....
}
]
....
]
}
“JSONSerialization”很难解码这个json。
let str = """
{"jsonrpc": "2.0","result": [{"code": 1,"message": "error"},[{"gid": "123"}]]}
"""
let data = str.data(using: .utf8)!
if let json = try! JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any],
let result = json["result"] as? [Any] {
let error = result.map { $0 as? [Any] }.filter { $0 != nil }
let objs = result.map { $0 as? [String: Any] }.filter { $0 != nil }
print(error)
print(objs)
}
有没有办法使用JSONDecoder将JSON有效负载解码为[Data]或其他任何内容。
struct Result: Codable {
let result: [???] //can't use [Data] here
}
答案 0 :(得分:0)
有没有办法使用JSONDecoder将JSON有效负载解码为[Data]或其他任何内容。
decode
上的JSONDecoder
方法需要符合JSONDecodable
的某种类型。是的,Any
不符合Decodable
,Data
或[Data]
也不符合Decodable
。您可能希望定义一个自定义Swift类型来表示您的JSON并使 符合result
。
如何解码内部不同类型的数组?
我们希望看到完整的JSON的原因是知道struct JSONRPC: Decodable {
enum Result: Decodable {
struct ArrayItem: Decodable {
let code: Int
let message: String
}
case array([ArrayItem])
case dictionary(Dictionary<String, String>)
init(from decoder: Decoder) throws {
// Implement decoder for enum with associated values.
// This will not "just work" without your additional
// instructions specifying how to do it. But that's an
// answer for a separate question, I think.
}
}
let version: String
let results: [Result]
private enum CodingKeys: String, CodingKey {
case version = "jsonrpc"
case results = "result"
}
}
中的字典和数组是否一致是有用的。如果条目都像你的例子,那么也许你可以这样做:
let decoder = JSONDecoder()
let payload = try decoder.decode(JSONRPC.self, from: data)
有了这个,你可以像这样使用它:
RPCJSON
如果解码成功,则有效载荷将是<a href="{{ route('gegonota', [ $gid,$cid , $nid]) }}">{{$nomos->name}}</a>
的实例。