2017-12-21 7 views
0

Codableプロトコルを使用して部分的にシリアライズされたjson文字列を部分的にデコードするにはどうすればよいですか?`Codable`プロトコルを使って部分的に二重シリアル化されたjson文字列をデコードするにはどうしたらいいですか?

class Person : Codable { 
     var name : String? 
     var hobby : String? 
    } 
    class Family : Codable { 
     var person: String? 
     var person_: Person? 
    } 
    class PerfectFamily : Codable { 
     var person: Person? 
    } 

    let jsonString = "{\"person\":\"{\\\"name\\\":\\\"Mike\\\",\\\"hobby\\\":\\\"fishing\\\"}\"}" 
    do { 
     // I could do this. 
     let family = try JSONDecoder().decode(Family.self, from: Data(jsonString.utf8)) 
     family.person_ = try JSONDecoder().decode(Person.self, from: Data(family.person!.utf8)) 
     print(family) 

     // However I want to write more simply like this. Do you have some idea? 
     let perfectFamily = try JSONDecoder().decode(PerfectFamily.self, from: Data(jsonString.utf8)) // error 
     print(perfectFamily) 

    } catch { 
     print(error) 
    } 
+0

JSONをどのようにエンコードしているかを表示できますか? JSONを解読するのではなく、JSONを修正する必要があります。 –

+0

ああ...そうだ。このjson形式はサーバーからの応答です。私はそれを制御することはできません。 –

答えて

1

あなたがあなたのPerfectFamilyクラスに独自のカスタムデコーダ方法を提供することができ、あなたの二重エンコードされたJSONを修正することはできませんが、私は構造体を使用することをお勧めしている場合:


struct Person: Codable { 
    let name: String 
    let hobby: String 
} 

struct PerfectFamily: Codable { 
    let person: Person 
    init(from decoder: Decoder) throws { 
     let container = try decoder.singleValueContainer() 
     let person = try container.decode([String: String].self)["person"] ?? "" 
     self.person = try JSONDecoder().decode(Person.self, from: Data(person.utf8)) 
    } 
} 

let json = "{\"person\":\"{\\\"name\\\":\\\"Mike\\\",\\\"hobby\\\":\\\"fishing\\\"}\"}" 

do { 
    let person = try JSONDecoder().decode(PerfectFamily.self, from: Data(json.utf8)).person 
    print(person) // "Person(name: "Mike", hobby: "fishing")\n" 
} catch { 
    print(error) 
} 
+0

まず、私は言葉に間違っていました。「二重符号化」ではなく、「二重直列化」は正しいものでした。 私はサーバーエンジニアと話し合いましたが、あなたが言ったように、 'double serialize'は不要であることがわかりました。 しかし影響が大きいので直ちに変更することはできません。それから私はあなたのアイデアを使用します。どうもありがとうございました。私は非常に満足している。 –

+0

あなたは大歓迎です –

関連する問題