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

查看:97
本文介绍了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>下标返回非可选的T.对于此JSON(包装在可选的数组下标中),返回Optional<AnyObject>.但是,Dictionary<K, V>下标返回Optional<V>.对于此JSON,下标返回非常奇怪的外观 Optional<Optional<AnyObject>>(即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??).

  • jsonOptional<AnyObject>.
  • json?["Language"]返回Optional<Optional<AnyObject>>.
  • json?["Language"]??["Field"]返回Optional<Optional<AnyObject>>.
  • json?["Language"]??["Field"]??[0]返回Optional<AnyObject>.
  • json?["Language"]??["Field"]??[0]?["Number"]返回Optional<Optional<AnyObject>>.
  • json?["Language"]??["Field"]??[0]?["Number"] as? String返回Optional<String>.
  • 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>.

然后if let语法使用Optional<String>来生成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)
    }
}


快速4更新


Swift 4 Update

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天全站免登陆