将JSON字符串转换为模型对象失败

时间:2019-09-30 09:29:18

标签: ios json swift codable

我有一个来自服务器的很大的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,我想为其创建解析器

1 个答案:

答案 0 :(得分:0)

问题在于您的JSON字符串的结构与您的想法不同。如果我们删除所有转义字符,那么您拥有的JSON是这样的:

mappend

{"appConfig" : "{\"launcherAfterLogin\":\"activities.jobs.JobListingActivity\",\"logging\":true,\"crashReport\":true,\"defaultLanguage\":\"en-US\"}"} 键的值是一个包含另一个转义的JSON字符串的字符串。

要解决此问题,请修复传入的JSON或将appConfig解码为字符串,然后将那个字符串解码为appConfig对象