没有与键解析 json 关联的值

Posted

技术标签:

【中文标题】没有与键解析 json 关联的值【英文标题】:No value associated with key parse json 【发布时间】:2018-12-13 09:20:53 【问题描述】:

大家好,我想解码这个 json 数据,我想得到 城市,但是如果删除我模型中的位置,它会失败,而其他人很好。谁能帮帮我这是我的代码。

"results": 
    "datetime": [
        
            "times": 
                "Imsak": "04:07",
                "Sunrise": "05:32",
                "Fajr": "04:17",
                "Dhuhr": "11:47",
                "Asr": "15:14",
                "Sunset": "18:02",
                "Maghrib": "18:16",
                "Isha": "19:13",
                "Midnight": "23:10"
            ,
            "date": 
                "timestamp": 1544659200,
                "gregorian": "2018-12-13",
                "hijri": "1440-04-06"
            
        
    ],
    "location": 
        "latitude": -6.2375,
        "longitude": 106.69556,
        "elevation": 26,
        "city": "Ciputat",
        "country": "Republic of Indonesia",
        "country_code": "ID",
        "timezone": "Asia/Jakarta",
        "local_offset": 7
    

这是我的模型对象,其中城市关联键中没有值没有值,但奇怪的是,如果删除结构结果下的 var 位置并且所有关联它工作正常,只有位置是问题。

struct PrayerModel: Decodable 
   var results: Results


struct Results: Decodable 
   var datetime: [DateTime]
   var location: Location


struct Location: Decodable 
   var city: String

init(dictionary: [String: String]) 
    self.city = dictionary["city"] ?? ""
  


struct DateTime: Decodable 
   var times: Times


struct Times: Decodable 
  var Imsak: String
  var Sunrise: String
  var Fajr: String
  var Dhuhr: String
  var Asr: String
  var Sunset: String
  var Maghrib: String
  var Isha: String
  var Midnight: String

init(dictionary: [String: String]) 
    self.Imsak = dictionary["Imsak"] ?? ""
    self.Sunrise = dictionary["Sunrise"] ?? ""
    self.Fajr = dictionary["Fajr"] ?? ""
    self.Dhuhr = dictionary["Dhuhr"] ?? ""
    self.Asr = dictionary["Asr"] ?? ""
    self.Sunset = dictionary["Sunset"] ?? ""
    self.Maghrib = dictionary["Maghrib"] ?? ""
    self.Isha = dictionary["Isha"] ?? ""
    self.Midnight = dictionary["Midnight"] ?? ""
  

这是我的错误出现的地方,错误在哪里?我想不通

Failed to decode data: keyNotFound(CodingKeys(stringValue: "city", intValue: nil), Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "results", intValue: nil), CodingKeys(stringValue: "location", intValue: nil)], debugDescription: "No value associated with key CodingKeys(stringValue: \"city\", intValue: nil) (\"city\").", underlyingError: nil))

【问题讨论】:

可能是城市缺少真实响应 @Sh_Khan 缺少真正的回应是什么意思? 您显示的 JSON 是导致问题的完整 JSON,还是只是一个示例?它是导致崩溃的原因吗?或者是另一个?可能导致错误的原因是,在一种情况下,没有城市值(或为零),它会导致崩溃。 【参考方案1】:

这对我有用,不知道你为什么使用 Codable 字典中的 init

import UIKit
import PlaygroundSupport

let jsonData = """
 
    "results": 
        "datetime": [
            "times": 
                "Imsak": "04:07",
                "Sunrise": "05:32",
                "Fajr": "04:17",
                "Dhuhr": "11:47",
                "Asr": "15:14",
                "Sunset": "18:02",
                "Maghrib": "18:16",
                "Isha": "19:13",
                "Midnight": "23:10"
            ,
            "date": 
                "timestamp": 1544659200,
                "gregorian": "2018-12-13",
                "hijri": "1440-04-06"
            
        ],
        "location": 
            "latitude": -6.2375,
            "longitude": 106.69556,
            "elevation": 26,
            "city": "Ciputat",
            "country": "Republic of Indonesia",
            "country_code": "ID",
            "timezone": "Asia/Jakarta",
            "local_offset": 7
        
    

""".data(using: .utf8)!

struct PrayerModel: Decodable 
    var results: Results


struct Results: Decodable 
    var datetime: [DateTime]
    var location: Location


struct Location: Decodable 
    var city: String


struct DateTime: Decodable 
    var times: Times


struct Times: Decodable 
    var Imsak: String
    var Sunrise: String
    var Fajr: String
    var Dhuhr: String
    var Asr: String
    var Sunset: String
    var Maghrib: String
    var Isha: String
    var Midnight: String


do 
    let result = try JSONDecoder().decode(PrayerModel.self, from: jsonData)
    print(result)

    print("city: \(result.results.location.city)")
 catch 
    print(error)

输出:

PrayerModel(results: __lldb_expr_53.Results(datetime: [__lldb_expr_53.DateTime(times: __lldb_expr_53.Times(Imsak: "04:07", Sunrise: "05:32", Fajr: "04:17", Dhuhr: “11:47”,Asr:“15:14”,日落:“18:02”,马格里布:“18:16”,Isha:“19:13”,午夜:“23:10”))],位置: __lldb_expr_53.Location(city: "Ciputat")))

城市:锡普塔特

【讨论】:

我试试你的,但它仍然显示错误没有价值。这就是为什么它让我感到困惑。是bug还是什么? 检查您的响应是否符合预期,只需将其转换为字符串并检查即可。 试试这个var city: String? @Sh_Khan 响应是城市为零。怎么是零? @ferryawijayanto 如果您的 API 不返回数据,除非您可以控制 API,否则您无能为力。您可以尝试通过映射 API(苹果内置或谷歌会这样做)对纬度/经度进行反向地理编码,以查找纬度/经度并查看是否获得更多信息

以上是关于没有与键解析 json 关联的值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 Decodable - 没有与键 CodingKeys 关联的值 [重复]

cuda Thrust 如何获取与键关联的值

Docker配置文件daemon.json解析

JSONObject对象

如何从android中的php关联数组解析JSON响应?

json转dataset的另外一种解析方式自动生成guid强关联