2017-12-21 12 views
0

어떻게 Codable 프로토콜을 사용하여 부분적으로 이중 직렬화 된 JSON 문자열을 디코딩 할 수 있습니까? 당신이 당신의 이중 인코딩 된 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을 수정해야합니다. –

+0

아 ... 알았어요. 이 json 형식은 서버의 응답입니다. 나는 그것을 제어 할 수 없다. –

답변

1

당신은 당신의 PerfectFamily 클래스에 사용자 지정 디코더 방법을 제공 할 수 있지만 구조체 사용하는 것이 좋습니다 :


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

당신은 환영합니다 –