JSON解析Swift 3

Nas*_*296 21 xcode parsing json swift

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

{
  "Language": {

    "Field":[
          {
          "Number":"976",
          "Name":"Test"
          },
          {
          "Number":"977",
          "Name":"Test"
          }
       ]
   }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*mas 27

你试过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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • json是一个Optional<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>.

Optional<String>,然后由使用if let语法产物String.


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

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

Swift 4更新

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

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

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

接下来,我们可以定义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" }
}
Run Code Online (Sandbox Code Playgroud)

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


现在解析JSON很简单.

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

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

for field in object.language.fields {
    print(field.number)
}
Run Code Online (Sandbox Code Playgroud)


ser*_*zhd 13

Xcode 8和Swift 3中, id现在导入Any而不是AnyObject

这意味着JSONSerialization.jsonObject(with: data)退货Any.所以你必须将json data转换为特定的类型[String:Any].同样适用于json下面的下一个字段.

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

var data = jsonString.data(using: .utf8)!
if let parsedData = try? JSONSerialization.jsonObject(with: data) as! [String:Any] {
    let language = parsedData["Language"] as! [String:Any]
    print(language)
    let field = language["Field"] as! [[String:Any]]
    let name = field[0]["Name"]!
    print(name) // ==> Test1
}
Run Code Online (Sandbox Code Playgroud)

在实践中,你可能想要一些特定的字段埋在json中.让我们假设它NameField数组的第一个元素的字段.您可以使用这样的unwraps链来安全地访问该字段:

var data = jsonString.data(using: .utf8)!
if let json = try? JSONSerialization.jsonObject(with: data) as? [String:Any],
    let language = json?["Language"] as? [String:Any],
    let field = language["Field"] as? [[String:Any]],
    let name = field[0]["Name"] as? String, field.count > 0 {
    print(name) // ==> Test1
} else {
    print("bad json - do some recovery")
}
Run Code Online (Sandbox Code Playgroud)

您也可以查看Apple的Swift博客在Swift中使用JSON