【发布时间】:2019-09-30 09:29:18
【问题描述】:
我有一个来自服务器的非常大的 JSON,但转换为 Model 对象失败。
我已经尝试了很多相同的修复方法,但它们都不起作用
所以我提取了一个键,其中包含一些反映模型的值
它在大 JSON 中的样子(appConfig 是众多键之一)
\"appConfig\":\"{\\\"launcherAfterLogin\\\":\\\"ma.dista.activities.jobs.JobListingActivity\\\",\\\"logging\\\":true,\\\"crashReport\\\":true,\\\"defaultLanguage\\\":\\\"en-US\\\"}\"
当我将其提取出来并将其分配给 String 变量时的样子
{\"appConfig\":\"{\\\"launcherAfterLogin\\\":\\\"activities.jobs.JobListingActivity\\\",\\\"logging\\\":true,\\\"crashReport\\\":true,\\\"defaultLanguage\\\":\\\"en-US\\\"}\"}
我创建了一个模型来将此 JSON 映射到
struct Config: Decodable {
let appConfig: AppConfig
}
struct AppConfig: Decodable {
let launcherAfterLogin: String?
let logging: Bool?
let crashReport: Bool?
let defaultLanguage: String?
let updateUrl: String?
let imageUploadAsPDF: Bool?
}
然后我使用下面的代码将 JSON 映射到模型
let jsonStringModified = "{\"appConfig\":\"{\\\"launcherAfterLogin\\\":\\\"activities.jobs.JobListingActivity\\\",\\\"logging\\\":true,\\\"crashReport\\\":true,\\\"defaultLanguage\\\":\\\"en-US\\\"}\"}"
let jsonData = jsonStringModified.data(using: .utf8)!
do {
let jsonModel = try JSONDecoder().decode(Config.self, from: jsonData)
print(jsonModel)
} catch let error as NSError {
print(error)
}
现在,当我运行它时,它会因这个错误而崩溃
Error Domain=NSCocoaErrorDomain Code=4864 "预期解码 字典,但找到了一个字符串/数据。” 用户信息={NSCodingPath=( "CodingKeys(stringValue: \"appConfig\", intValue: nil)" ), NSDebugDescription=预期解码 Dictionary 但 而是找到了一个字符串/数据。}
我还尝试将此数据值转换为 JSONSerialised Dictionary,然后返回到 JSONSerialised Data,然后我将其提供给 JSONDecoder
do {
if let jsonSerialised = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) as? [String: Any] {
let jsonSerialisedUpdated = try JSONSerialization.data(withJSONObject: jsonSerialised, options: .prettyPrinted)
let jsonModel = try JSONDecoder().decode(Config.self, from: jsonData)
print(jsonModel)
}
} catch let error as NSError {
print(error)
}
但这里也面临同样的错误
另外,在我的 Big JSON 中,每次我运行时,只有这个键(appConfig)会从所有键中崩溃
更新:
实际上整个Config 模型是作为String 进来的,它里面有各种键,比如appConfig 和其他的,我正在创建一个解析器来将这个Config 作为字符串转换为Config 作为模型
struct BiggerConfig: Decodable {
let otherConfig: CustomType
let config: String // I want to convert this String to Config type which has keys like appConfig inside it
}
上面的config 实际上是一个JSON,但它是来自服务器的String,我想为它创建一个解析器
【问题讨论】:
-
那不是有效的 JSON 是不是...
-
因为错误清楚地表明键
appConfig的值不是字典。这是另一个必须在第二级解码的 JSON 字符串。顺便说一句,发送嵌套 JSON 字符串的格式非常愚蠢。 -
又快又坏:pastebin.com/Eb3bKNZS 但你可能明白了 ;) 覆盖
init()可能是关键 -
@Larme 哇,效果很好,但是效果如何?
-
因为我将变量命名为
jsonStringified。它是 JSON 中的 JSON 字符串化。因此,您需要将字符串转换为数据,并将其解码回来。一步步。正如您从jsonData到 Config 所做的那样,然后,将值作为字符串读取,将其转换回数据,让 JSONDecoder 从那里完成...