programing

Swift에서 JSON을 디코딩할 때 "데이터가 없어 데이터를 읽을 수 없습니다" 오류가 발생했습니다.

abcjava 2023. 3. 12. 10:18
반응형

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

반응형