ios - 使用 Swift 4 在 iOS 中将多级 JSON 解码为结构

标签 ios swift multi-level decodable jsondecoder

<分区>

我正在尝试将我的数据解码为结构。这是我的数据结构之一的 JSON 示例:

{
    "name": "abc",
    "owner": "bcd",
    "fallbackLanguage": "tr",
    "localizedValues": {
        "en": {
            "description": "Lorem Ipsum Dolor Sit Amet"
        },
        "de": {
            "description": "Sed Do Eiusmod Tempor Incididunt"
        },
        "tr": {
            "description": "Consectetur Adipisicing Elit"
        }
    }
}

这个 JSON 对象的结构是:

struct X {
  let name: String
  let owner: String
  let fallbackLanguage: String

  let description: String
}

解码 nameownerfallbackLanguage 不是问题并且已经完成。这是当前的 CodingKeyinit(from:)

struct CodingKeys: CodingKey {
    var stringValue: String
    init?(stringValue: String) {
      self.stringValue = stringValue
    }

    var intValue: Int?
    init?(intValue: Int) {
      self.intValue = intValue
      self.stringValue = "\(intValue)"

    }

    static func makeKey(name: String) -> CodingKeys {
      return CodingKeys.init(stringValue: name)!
    }
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)

    owner = try container.decode(String.self, forKey: CodingKeys.makeKey(name: "owner"))
    name = try container.decode(String.self, forKey: CodingKeys.makeKey(name: "name"))
    fallbackLanguage = try container.decode(String.self, forKey: CodingKeys.makeKey(name: "fallbackLanguage"))

    // FIXME: decode localizedValues into `description`
}

问题是解码description,因为它保存在多级字典中,并且它的值会因设备区域设置而改变。

在此示例中,如果设备区域设置不是endetr,它将回退到tr 因为 fallbackLanguage 是 tr

任何帮助和建议都会很棒。谢谢。

注意:我包括了this gist通过 inamiy编码/解码字典和数组。

最佳答案

我建议为 localizedValues 创建一个结构并将值解码到字典中。然后获取当前的fallbackLanguage,从字典中获取对应的描述。不需要自定义 CodingKeys 和初始化器。

let jsonString = """
{    "name": "abc",
    "owner": "bcd",
    "fallbackLanguage": "tr",
    "localizedValues": {
        "en": { "description": "Lorem Ipsum Dolor Sit Amet"},
        "de": { "description": "Sed Do Eiusmod Tempor Incididunt"},
        "tr": { "description": "Consectetur Adipisicing Elit"}
    }
}
"""

struct X : Decodable {
    let name: String
    let owner: String
    let fallbackLanguage: String

    let localizedValues: [String:LocalizedValue]
}

struct LocalizedValue : Decodable {
    let description : String
}

let data = Data(jsonString.utf8)
do {
    let result = try JSONDecoder().decode(X.self, from: data)
    let fallBackLanguage = result.fallbackLanguage
    let fallBackLanguageDescription = result.localizedValues[fallBackLanguage]?.description
    print(fallBackLanguageDescription)

} catch { print(error)}

关于ios - 使用 Swift 4 在 iOS 中将多级 JSON 解码为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49815450/

相关文章:

objective-c - 根据另一个字段的值设置文本字段的值

ios - 打开 Thread Sanitizer 会产生信号 SIGABRT

ios - CarbonKit CarbonTabSwipeNavigation,Viewcontrollers 未正确对齐

c++ - 构建多级字典 : a python to c++ translation

ios - 选择单元格后的事件指示器

ios - 呈现 navigationController 时出错

ios - UIAlertController 的 NSNotification

快速解析查询跳过空列

css - 需要多个子级 CSS 帮助的响应式选项卡

node.js - 所有字段搜索