Swift에서 JSON을 디코딩할 때 "데이터가 없어 데이터를 읽을 수 없습니다" 오류가 발생했습니다.
다음 오류가 발생하였습니다.
데이터가 누락되어 읽을 수 없습니다.
다음 코드를 실행하면:
struct Indicator: Decodable {
let section: String
let key: Int
let indicator: Int
let threshold: Int
}
var indicators = [Indicator]()
do {
if let file = Bundle.main.url(forResource: "indicators", withExtension: "json") {
indicators = try JSONDecoder().decode([Indicator].self, from: try Data(contentsOf: file))
}
} catch {
print(error.localizedDescription)
}
기능하고 있습니다만, 알기 쉽게 삭제했습니다.다른 파일에도 매우 유사한 코드 블록이 있기 때문에(이 코드를 거기서 복사해, 이름을 근본적으로 변경했습니다) 그 이유는 알 수 없습니다.json 파일은 유효한 json이며 대상이 올바르게 설정되어 있습니다.
감사해요.
인쇄error.localizedDescription
는 전혀 의미 없는 일반적인 오류 메시지만 표시하기 때문에 오해의 소지가 있습니다.
그러니 절대 캐치블럭에 사용하지 마세요.
간단한 형태로는
print(error)
중요한 정보를 포함한 전체 오류가 표시됩니다.debugDescription
그리고.context
.Decodable
오류는 매우 포괄적입니다.
코드를 개발하는 동안 각 코드를 잡을 수 있습니다.Decodable
예를 들어 개별적으로 오류 발생
} catch let DecodingError.dataCorrupted(context) {
print(context)
} catch let DecodingError.keyNotFound(key, context) {
print("Key '\(key)' not found:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch let DecodingError.valueNotFound(value, context) {
print("Value '\(value)' not found:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch let DecodingError.typeMismatch(type, context) {
print("Type '\(type)' mismatch:", context.debugDescription)
print("codingPath:", context.codingPath)
} catch {
print("error: ", error)
}
가장 중요한 정보만 보여줍니다.
저는 방금 비슷한 문제를 해결했습니다만, 부동산 리스트 디코더는 제외했습니다.
이 경우의 오류는 데이터 전체가 아니라 키가 발견되지 않았음을 의미합니다.
구조 내의 변수를 옵션으로 설정해 보면 문제가 있는 곳에 0의 값이 반환됩니다.
"데이터가 없어 데이터를 읽을 수 없습니다."
다음 코드에서 발생하는 오류:
...catch {
print(error.localizedDescription)
}
왜냐하면: 키가 없거나 잘못 입력된 것 같습니다.
다음과 같이 코딩하여 누락된 키를 확인할 수 있습니다.
...catch {
debugPrint(error)
}
주의: 구조 키가 JSON 데이터 키와 다른 경우 아래 예를 참조하십시오. 구조 키는 'title'이지만 데이터 키는 'name'입니다.
struct Photo: Codable {
var title: String
var size: Size
enum CodingKeys: String, CodingKey
{
case title = "name"
case size
}
}
이름'을 잘못 입력하면 오류가 나타납니다.
또, 이 「Coding Keys」를 잘못 입력하면, 에러가 표시됩니다.
enum CodingKeys:...
설명만 인쇄하지 말고 실제 오류를 인쇄해 보십시오.당신에게 다음과 같은 메시지를 줄 것이다."No value associated with key someKey (\"actual_key_if_you_defined_your_own\")."
이것은, 보다 훨씬 편리합니다.localizedDescription
.
그냥 같은 오류가 있었어.디코더 수동 코드에 오류가 있습니다.코드 속성 completedOn은 옵션이었지만 디코딩 시 try? 대신 try?를 사용하고 있었습니다.값이 json에서 누락되면 해당 속성의 디코딩이 실패합니다.내 뜻을 더 잘 이해하려면 아래의 코드를 참조하십시오.
public var uuid: UUID
public var completedOn: Date?
...
required public convenience init(from decoder: Decoder) throws {
self.init()
let container = try decoder.container(keyedBy: CodingKeys.self)
self.uuid = try container.decode(UUID.self, forKey: .uuid)
self.completedOn = try? container.decode(Date.self, forKey: .completedOn)
}
먼저 속성을 옵션으로 설정합니다.
이와 유사한 경우 이 decodeIfPresent를 사용해 보십시오.
`public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
firstName = try container.decodeIfPresent(String.self, forKey: .firstName)
}`
언급URL : https://stackoverflow.com/questions/46959625/the-data-couldn-t-be-read-because-it-is-missing-error-when-decoding-json-in-sw
'programing' 카테고리의 다른 글
Gson을 사용하여 알 수 없는 필드를 사용하여 JSON을 디코딩하려면 어떻게 해야 합니까? (0) | 2023.03.12 |
---|---|
ORA-00054: 리소스가 사용 중이고 NOWAIT가 지정되어 있거나 타임아웃이 만료되었습니다. (0) | 2023.03.12 |
wordpress: 헤더의 기본 위치.php 및 바닥글.php (0) | 2023.03.12 |
메모장++에서 JSON을 다시 포맷하는 방법 (0) | 2023.03.12 |
Hoverintent 지연 온마우스아웃을 유지하면서 Superfish 드롭다운 메뉴 온마우스오버 지연 제거 (0) | 2023.03.12 |