2017-11-28 11 views
0

私はNiceHash APIからアプリを開発しています。私はこのようなルックスと仕事をしなければならないJSON:解析に異なるJSONをデコード可能な(ネストされた配列)でパースします

{ 
    "result":{ 
     "addr":"37ezr3FDDbPXWrCSKNfWzcxXZnc7qHiasj", 
     "workers":[ 
        [ "worker1", { "a":"45.7" }, 9, 1, "32", 0, 14 ], 
        [ "worker1", { }, 5, 1, "100000", 0, 22 ], 
     ] 
     "algo":-1 
    }, 
    "method":"stats.provider.workers" 
} 

は、応答は、私がいることを理解し、私は私が間違ってやっているのか理解することはできません、同じnilであるこのような構造に

struct Root: Decodable { 
    var result: WorkersResult? 
    var method: String? 
} 

struct WorkersResult: Decodable { 
    var addr: String? 
    var workers: [Workers]? 
    var algo: Int? 
} 

struct Workers: Decodable { 
    var worker: [Worker]? 
} 

struct Worker: Decodable { 
    var name: String? 
    var hashrate: Hashrate? 
    var time: Int? 
    var XNSUB: Int? 
    var difficult: String? 
    var reject: Int? 
    var algo: Int? 
} 

struct Hashrate: Decodable { 
    var rate: String? 
} 

を作りました問題は私が労働者がいくつかの有効なデータと等しい回答者をコメントしたので、労働者の配列を解析しています。 助けてくれてありがとう!

+0

すべてのプロパティがoptionalsている理由はありますか?たとえば、JSONに欠けているものがありますか? –

答えて

1

JSONは実際にはカンマが間違っているため無効です。それをJSONバリデーターを通して実行して、今私が意味しているものにします。

Worker(単数)は配列としてエンコードされているので、カスタムデコーダを用意する必要があります。 Workers(複数)は不要です。

struct Root: Decodable { 
    var result: WorkersResult? 
    var method: String? 
} 

struct WorkersResult: Decodable { 
    var addr: String? 
    var workers: [Worker]? 
    var algo: Int? 
} 

struct Worker: Decodable { 
    var name: String? 
    var hashrate: Hashrate? 
    var time: Int? 
    var XNSUB: Int? 
    var difficult: String? 
    var reject: Int? 
    var algo: Int? 

    init(from decoder: Decoder) throws { 
     var container = try decoder.unkeyedContainer() 
     name  = try container.decodeIfPresent(String.self) 
     hashrate = try container.decodeIfPresent(Hashrate.self) 
     time  = try container.decodeIfPresent(Int.self) 
     XNSUB  = try container.decodeIfPresent(Int.self) 
     difficult = try container.decodeIfPresent(String.self) 
     reject = try container.decodeIfPresent(Int.self) 
     algo  = try container.decodeIfPresent(Int.self) 
    } 
} 

struct Hashrate: Decodable { 
    var rate: String? 

    private enum CodingKeys: String, CodingKey { 
     case rate = "a" 
    } 
} 

使用法:

let jsonData = """ 
{ 
    "result":{ 
     "addr":"37ezr3FDDbPXWrCSKNfWzcxXZnc7qHiasj", 
     "workers":[ 
        [ "worker1", { "a":"45.7" }, 9, 1, "32", 0, 14 ], 
        [ "worker1", { }, 5, 1, "100000", 0, 22 ] 
     ], 
     "algo":-1 
    }, 
    "method":"stats.provider.workers" 
} 
""".data(using: .utf8)! 

let r = try JSONDecoder().decode(Root.self, from: jsonData) 
print(r) 
+0

ありがとうございました!それはうまく動作します! –

関連する問題