Swift 3 中的 JSON 解析 [英] JSON Parsing in Swift 3

查看:33
本文介绍了Swift 3 中的 JSON 解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法?我已经能够让数据返回,但是在将数据分解为特定字段时我没有成功.我会发布示例代码,但我已经尝试了很多不同的方法但没有成功并且没有保存任何方法.我想解析的基本格式是这样的.提前致谢.

Has anyone been able to find a way to parse through JSON files in Swift 3? I have been able to get the data to return but I am unsuccessful when it comes to breaking the data down into specific fields. I would post sample code but I've gone through so many different methods unsuccessfully and haven't saved any. The basic format I want to parse through is something like this. Thanks in advance.

{
  "Language": {

    "Field":[
          {
          "Number":"976",
          "Name":"Test"
          },
          {
          "Number":"977",
          "Name":"Test"
          }
       ]
   }
}

推荐答案

您是否尝试过 JSONSerialization.jsonObject(with:options:)?

var jsonString = "{" +
    ""Language": {" +
    ""Field":[" +
    "{" +
    ""Number":"976"," +
    ""Name":"Test"" +
    "}," +
    "{" +
    ""Number":"977"," +
    ""Name":"Test"" +
    "}" +
    "]" +
    "}" +
    "}"

var data = jsonString.data(using: .utf8)!

let json = try? JSONSerialization.jsonObject(with: data)

<小时>

Swift 有时会产生一些非常奇怪的语法.


Swift sometimes produces some very odd syntax.

if let number = json?["Language"]??["Field"]??[0]?["Number"] as? String {
    print(number)
}

JSON 对象层次结构中的所有内容最终都被包装为可选(即 AnyObject?).Array 下标返回一个非可选的 T.对于这个包裹在可选数组下标中的 JSON,返回 Optional.但是,Dictionary 下标返回一个 Optional.对于这个 JSON,下标返回看起来很奇怪的可选<可选>(即AnyObject??).

Everything in the JSON object hierarchy ends up getting wrapped as an optional (ie. AnyObject?). Array<T> subscript returns a non-optional T. For this JSON, which is wrapped in an optional, array subscript returns Optional<AnyObject>. However, Dictionary<K, V> subscript returns an Optional<V>. For this JSON, subscript returns the very odd looking Optional<Optional<AnyObject>> (ie. AnyObject??).

  • json 是一个 Optional.
  • json?["Language"] 返回一个 Optional>.
  • json?["Language"]??["Field"] 返回一个 Optional>.
  • json?["Language"]??["Field"]??[0] 返回一个 Optional.
  • json?["Language"]??["Field"]??[0]?["Number"] 返回一个 Optional>代码>.
  • json?["Language"]??["Field"]??[0]?["Number"] as?String 返回一个 Optional.
  • json is an Optional<AnyObject>.
  • json?["Language"] returns an Optional<Optional<AnyObject>>.
  • json?["Language"]??["Field"] returns an Optional<Optional<AnyObject>>.
  • json?["Language"]??["Field"]??[0] returns an Optional<AnyObject>.
  • json?["Language"]??["Field"]??[0]?["Number"] returns an Optional<Optional<AnyObject>>.
  • json?["Language"]??["Field"]??[0]?["Number"] as? String returns an Optional<String>.

Optional 然后由 if let 语法使用以产生 String.

The Optional<String> is then used by the if let syntax to product a String.

最后一点:迭代字段数组看起来像这样.

Final note: iterating the field array looks like this.

for field in json?["Language"]??["Field"] as? [AnyObject] ?? [] {
    if let number = field["Number"] as? String {
        print(number)
    }
}

<小时>

Swift 4 更新

Swift 4 使这一切变得更容易处理.我们将再次从您的测试数据开始(""" 让这变得更好).

Swift 4 makes this all much easier to deal with. Again we will start with your test data (""" makes this so much nicer).

let data = """
{
  "Language": {

    "Field":[
          {
          "Number":"976",
          "Name":"Test"
          },
          {
          "Number":"977",
          "Name":"Test"
          }
       ]
   }
}
""".data(using: .utf8)!

<小时>

接下来,我们可以围绕 JSON 中使用的对象定义类.


Next we can define classes around the objects used in your JSON.

struct Object: Decodable {
    let language: Language
    enum CodingKeys: String, CodingKey { case language="Language" }
}

struct Language: Decodable {
    let fields: [Field]
    enum CodingKeys: String, CodingKey { case fields="Field" }
}

struct Field: Decodable {
    let number: String
    let name: String
    enum CodingKeys: String, CodingKey { case number="Number"; case name="Name" }
}

CodingKeys 枚举是如何将结构属性映射到 JSON 对象成员字符串.此映射由 Decodable 自动完成.

The CodingKeys enum is how struct properties are mapped to JSON object member strings. This mapping is done automagically by Decodable.

现在解析 JSON 很简单.

Parsing the JSON now is simple.

let object = try! JSONDecoder().decode(Object.self, from: data)

print(object.language.fields[0].name)

for field in object.language.fields {
    print(field.number)
}

这篇关于Swift 3 中的 JSON 解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆