swift4 JSONDecoder。如何解码内部不同类型的数组?

时间:2017-07-18 11:29:42

标签: swift4

要解码的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
}

1 个答案:

答案 0 :(得分:0)

  

有没有办法使用JSONDecoder将JSON有效负载解码为[Data]或其他任何内容。

decode上的JSONDecoder方法需要符合JSONDecodable的某种类型。是的,Any不符合DecodableData[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> 的实例。