我有一个来自服务器的很大的JSON,但是到Model对象的转换失败。
我已经尝试了很多修复方法,但是没有一个起作用
所以我提取了一个具有与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代码= 4864“预期解码 字典,但找到了一个字符串/数据。” UserInfo = {NSCodingPath =( “ CodingKeys(stringValue:\” appConfig \“,intValue:nil)”),NSDebugDescription =预期对Dictionary进行解码,但是 而是找到了一个字符串/数据。}
我还尝试将此数据值转换为 JSONSerialized字典,然后再返回到 JSONSerialized数据,然后将其馈送到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 和其他键,我正在创建一个解析器来转换此{{ 1}}作为字符串,而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
}
实际上是 JSON ,但它是来自服务器的config
,我想为其创建解析器
答案 0 :(得分:0)
问题在于您的JSON字符串的结构与您的想法不同。如果我们删除所有转义字符,那么您拥有的JSON是这样的:
mappend
{"appConfig" : "{\"launcherAfterLogin\":\"activities.jobs.JobListingActivity\",\"logging\":true,\"crashReport\":true,\"defaultLanguage\":\"en-US\"}"}
键的值是一个包含另一个转义的JSON字符串的字符串。
要解决此问题,请修复传入的JSON或将appConfig
解码为字符串,然后将那个字符串解码为appConfig
对象