2017-10-28 4 views
1

코드 가능한 프로토콜을 따르는 Swift 구조체로 디코딩하려고하는 일부 JSON이 있습니다. 주요 구조체는 thread_type에 대한 codingKey 별칭을 인식하지 못하지만 명시 적으로 명명 된 thread_id 특성을 행복하게 사용합니다. 문제의 구조체는 다음과 같습니다 :중첩 된 스위프트 4 Codable 구조체가 불규칙하게 CodingKeys를 사용합니다.

struct Message: Codable { 
var id: String? 
var type: String? 
var thread_id: String? 
var threadType: String? 
var sender: User? 
var body: String? 
var media: String? 
var sentAt: Double? 
var unread: Bool? 
var status: String? 
var url: String? 

enum codingKeys: String, CodingKey { 
    case id 
    case type 
    case thread_id 
    case threadType = "thread_type" 
    case sender 
    case body 
    case media 
    case sentAt = "sent_at" 
    case unread 
    case status 
    case url 
} 
} 

내가 구문 분석하는 데 노력하고있어 JSON :

let json = 
""" 
{ 
"id": "Jvbl6LY", 
"type": "sms", 
"thread_id": "60LrVL7", 
"thread_type": "578a", 
"delay_until": null, 
"sender": { 
"id": "EVkdNBx", 
"type": "user", 
"first_name": "Jerry", 
"last_name": "Ward", 
"mobile_number": "123-456-7890", 
"profile_image_url": "", 
"is_online": false, 
"email": "[email protected]" 
}, 
"body": "Here is a picture of our Coquille Suite. Let me know if you would like a reservation?", 
"media": "", 
"sent_at": 1509133604000.167, 
"unread": false, 
"status": "", 
"url": "https://connect-staging.jypsee.com/api/sms/threads/60LrVL7/history/Jvbl6LY/" 
} 
""" 

을 마지막으로 디코더 호출 자체 :

let decoder = JSONDecoder() 
let data = json.data(using: .utf8)! 
do { 
    let message = try decoder.decode(Message.self, from: data) 
    print(message.thread_id) 
    print(message.threadType) 
    print(message.sender?.firstName) 
    print(message.sender?.lastName) 
} catch { 
    print(error) 
} 

message.thread_id 인쇄 Optional("60LrVL7")\n"이 예상됩니다. message.threadType은 nil\n을 인쇄합니다. 이는 예상치 못한 결과입니다. 더 이상한 것은 message.sender? .FirstName과 message.sender?. lastName이 각각 "Optional("Jerry")\n""Optional("Ward")\n"을 각각 인쇄한다는 사실입니다. 즉, 중첩 된 사용자 코드 가능 구조 CodingKey가 작동 중임을 의미합니다. 나는 디코딩에 왜 그런 일관성이 없는지에 관해서는 정말로 손해보고있다.

Xcode Playground Gist is available here

+3

'CodingKeys'가 아닌'codingKeys'. – Hamish

+0

Doh! 여분의 눈 세트가 할 수있는 것이 놀랍습니다. 고맙습니다! –

+0

모든 필드는 실제로 선택 사항입니까? 당신은'{}'로 보내질 수 있습니다. 그리고 여러분은 그것을 모든 nils로 해독 할 것을 기대할 것입니다. 그리고 빈 문자열이나 false와는 다른 nil을 고려할 것입니까? 'profile_image_url'이'' "''로 보내지고 있다는 사실은 그 사실을 매우 의심스럽게 만듭니다. 이 많은 옵션을 사용하는 것은 일반적으로 데이터 문제의 징조입니다. –

답변