首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Swift读取JSON文件

使用Swift读取JSON文件
EN

Stack Overflow用户
提问于 2014-06-25 22:04:26
回答 19查看 283.8K关注 0票数 257

我真的很难尝试将JSON文件读取到Swift中,这样我就可以使用它了。我已经花了2天的大部分时间重新搜索和尝试不同的方法,但到目前为止还没有运气,所以我注册了StackOverFlow,看看是否有人能给我指明正确的方向……

我的JSON文件名为test.json,其中包含以下内容:

代码语言:javascript
复制
{
  "person":[
     {
       "name": "Bob",
       "age": "16",
       "employed": "No"
     },
     {
       "name": "Vinny",
       "age": "56",
       "employed": "Yes"
     }
  ]
}    

该文件直接存储在文档中,我使用以下代码访问它:

代码语言:javascript
复制
let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
                                                          NSSearchpathDirectory.DocumentDirectory,
                                                          NSSearchPathDomainMask.AllDomainMask,
                                                          true) as String[]

if (dirs != nil) {
    let directories: String[] = dirs
    let dir = directories[0]
    let path = dir.stringByAppendingPathComponent(file)
}

var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.

var jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as? NSDictionary

println("jsonDict \(jsonDict)") - This prints nil..... 

如果有人能给我一个正确的方向,告诉我如何反序列化JSON文件并将其放在一个可访问的Swift对象中,我将永远感激不尽!

致以亲切的问候,

克里夫文兹。

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2014-06-25 22:10:37

遵循以下代码:

代码语言:javascript
复制
if let path = NSBundle.mainBundle().pathForResource("test", ofType: "json")
{
    if let jsonData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)
    {
        if let jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
        {
            if let persons : NSArray = jsonResult["person"] as? NSArray
            {
                // Do stuff
            }
        }
     }
}

“person”数组将包含关键人员的所有数据。遍历s以获取它。

Swift 4.0:

代码语言:javascript
复制
if let path = Bundle.main.path(forResource: "test", ofType: "json") {
    do {
          let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe)
          let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
          if let jsonResult = jsonResult as? Dictionary<String, AnyObject>, let person = jsonResult["person"] as? [Any] {
                    // do stuff
          }
      } catch {
           // handle error
      }
}
票数 346
EN

Stack Overflow用户

发布于 2020-05-12 11:15:55

Swift 5.1,Xcode 11

您可以使用以下命令:

代码语言:javascript
复制
struct Person : Codable {
    let name: String
    let lastName: String
    let age: Int
}

func loadJson(fileName: String) -> Person? {
   let decoder = JSONDecoder()
   guard
        let url = Bundle.main.url(forResource: fileName, withExtension: "json"),
        let data = try? Data(contentsOf: url),
        let person = try? decoder.decode(Person.self, from: data)
   else {
        return nil
   }

   return person
}
票数 32
EN

Stack Overflow用户

发布于 2019-02-24 03:28:38

简化Peter Kreinz提供的示例。适用于Swift 4.2。

扩展函数:

代码语言:javascript
复制
extension Decodable {
  static func parse(jsonFile: String) -> Self? {
    guard let url = Bundle.main.url(forResource: jsonFile, withExtension: "json"),
          let data = try? Data(contentsOf: url),
          let output = try? JSONDecoder().decode(self, from: data)
        else {
      return nil
    }

    return output
  }
}

示例模型:

代码语言:javascript
复制
struct Service: Decodable {
  let name: String
}

示例用法:

代码语言:javascript
复制
/// service.json
/// { "name": "Home & Garden" }

guard let output = Service.parse(jsonFile: "service") else {
// do something if parsing failed
 return
}

// use output if all good

该示例也适用于数组:

代码语言:javascript
复制
/// services.json
/// [ { "name": "Home & Garden" } ]

guard let output = [Service].parse(jsonFile: "services") else {
// do something if parsing failed
 return
}

// use output if all good

注意我们没有提供任何不必要的泛型,因此我们不需要转换parse的结果。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24410881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档