【问题标题】:JSONDecoder().decode fails when commas [closed]逗号时 JSONDecoder().decode 失败[关闭]
【发布时间】:2022-01-12 13:19:55
【问题描述】:

当名称字段末尾有逗号时,JSONDecoder().decode 会失败。为什么会这样?我该如何解决?

    let string = "[{\"name\":\"Homeoffice Marc,\",\"Km\":846.7911330652549,\"Strid\": \"DE262B62633E34AAA8A622E189B42920B319C371\"},{\"name\":\"Küche,\",\"Km\":857.8694764184313,\"Strid\": \"BD1A60D736BE86377121A2CC713251DBE2603BD5\"},{\"name\":\"Besprechungszimmer,\",\"Km\":857.8721480885644,\"Strid\": \"751A10C5D3065F91CC9F5BDF5E7111DC452D1C39\"},{\"name\":\"Büro Vertrieb,\",\"Km\":857.8723091979339,\"Strid\": \"148F97F324BB59EAFF613A0EB3766E026CFAB320\"},{\"name\":\"Büro Produktmanagement und Support,\",\"Km\":857.8734889037903,\"Strid\": \"3A37C955F7D3C012577B1D19B6F662AD233372A5\"},{\"name\":\"Tischkicker,\",\"Km\":857.8748603133218,\"Strid\": \"B5B8A86BBA2102AF56721166D2E814736EF13132\"},{\"name\":\"Büro Entwicklung,\",\"Km\":857.8773683652697,\"Strid\": \"E6814BE03EEF386E63AD7609D970BD9BA8CE71AD\"},{\"name\":\"Syfit GmbH,\",\"Km\":857.877841443768,\"Strid\": \"64F80B1EC04D008E060F28D7F198A8C39DCD53B5\"},{\"name\":\"Büro Zolti,\",\"Km\":857.8798725612223,\"Strid\": \"23F4C2E1C467AEC9D55D873DC3ED7FC73CD92177\"},{\"name\":\"Globale Suche\",\"Km\":null,\"Km\":846.7911330652549}]"
    
let data = string.data(using: .utf8) ?? Data()
let areas = try? JSONDecoder().decode([AreaModel].self, from: data)

解码此数据返回 nil

我的模特:

struct AreaModel: Codable {
    enum CodingKeys: String, CodingKey {
        case name
        case km = "Km"
        case strid = "Strid"
    }
    
    let name: String
    let km: Double?
    let strid: String
}

【问题讨论】:

  • 请分享所有代码
  • 我添加了所有代码。请看一下。想要在名称中不带逗号的情况下添加所有内容,并按预期进行解码
  • 你注意到最后一个条目有一个重复的键“Km”吗?
  • 可能是错字或逻辑错误检查一下let strid: String?
  • 使用正确的 do/try/catch 并打印错误,这应该会很快发现问题。

标签: json swift decoder


【解决方案1】:

请不要忽略抛出的错误。

如果您无法自行调试,切勿使用 try?。有了更多经验,我会说我们倾向于不使用try?,但有时我们会使用。但是当我们写try?时,我们能够找到一个可能的问题,即如果需要调试。

那么让我们做一个适当的尝试,使用 do/catch:

do {
    let areas = try JSONDecoder().decode([AreaModel].self, from: data)
    print(areas)
} catch {
    print("Error while decoding: \(error)") //and print error, not error.description which is for non-developer and will be missing important information
}

应该输出什么:

Error while decoding: 
keyNotFound(CodingKeys(stringValue: "Strid", intValue: nil),
                       Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 9", intValue: 9)], 
                       debugDescription: "No value associated with key CodingKeys(stringValue: \"Strid\", intValue: nil) (\"Strid\").", underlyingError: nil))

因此,导致问题的原因是 JSON 数组的第 9 个元素。 它无法正确解码Strid 值。没有有效的字符串值。

让我们看看...你有{"name":"Globale Suche","Km":null,"Km":846.7911330652549}。事实上,这里没有 Strid 键。你是说{"name":"Globale Suche","Strid":null,"Km":846.7911330652549} 吗?即使是这样,它也是null,换句话说,在Swift 中它会是nil。因此,要处理这种情况,您需要将 Strid 值设为可选

let strid: String?

旁注,如果以another question of mine 作为答案的开头,那么显然不是抄袭。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多