【问题标题】:Converting JSON string to Model Object fails [duplicate]将 JSON 字符串转换为模型对象失败 [重复]
【发布时间】: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 从那里完成...

标签: ios json swift codable


【解决方案1】:

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

{"appConfig" : "{\"launcherAfterLogin\":\"activities.jobs.JobListingActivity\",\"logging\":true,\"crashReport\":true,\"defaultLanguage\":\"en-US\"}"}

appConfig 键的值是一个包含另一个转义 JSON 字符串的字符串。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2012-07-05
    • 2014-11-20
    • 2019-08-27
    • 2020-05-27
    相关资源
    最近更新 更多