코드 가능한 프로토콜을 따르는 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
'CodingKeys'가 아닌'codingKeys'. – Hamish
Doh! 여분의 눈 세트가 할 수있는 것이 놀랍습니다. 고맙습니다! –
모든 필드는 실제로 선택 사항입니까? 당신은'{}'로 보내질 수 있습니다. 그리고 여러분은 그것을 모든 nils로 해독 할 것을 기대할 것입니다. 그리고 빈 문자열이나 false와는 다른 nil을 고려할 것입니까? 'profile_image_url'이'' "''로 보내지고 있다는 사실은 그 사실을 매우 의심스럽게 만듭니다. 이 많은 옵션을 사용하는 것은 일반적으로 데이터 문제의 징조입니다. –