使用 SwiftyJSON 从 JSON 读取数据时返回 Null

Posted

技术标签:

【中文标题】使用 SwiftyJSON 从 JSON 读取数据时返回 Null【英文标题】:Getting Null in return when reading data from JSON using SwiftyJSON 【发布时间】:2016-05-24 07:34:08 【问题描述】:

我正在从两个地方读取 JSON:1) 从文件和 2) 从 url。 这是我的 JSON 文件


"People": 

    "Person1" : 

        "Name" : "Umair",
        "Age" : "22"
    ,

    "Person2" : 

        "Name" : "Rehman",
        "Age" : "28"
    ,

    "Person3" : 

        "Name" : "Saqib",
        "Age" : "32"
    ,

    "Person4" : 

        "Name" : "Fahad",
        "Age" : "18 "
    ,

  

这就是我使用 SwiftyJson 阅读它的方式

let path: String = NSBundle.mainBundle().pathForResource("jsonFile", ofType: "json") as String!
let jsonData = NSData(contentsOfFile: path) as NSData!
let readableJSON = JSON(data: jsonData, options: .MutableContainers, error: nil)
var myName = readableJSON["People","Person1","Name"]
print(myName)

结果它给我的名字在这里没有问题。当我尝试使用相同的方法从 url 获取 Json 时,我得到了完整的 Json 文件作为回报,但是当我尝试获取特定字段时,它返回 null。这是我的代码

    let url = NSURL(string: "http://api.randomuser.me/")
    let session = NSURLSession.sharedSession()
    session.dataTaskWithURL(url!, completionHandler:  ( data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in

        // Make sure we get an OK response
        guard let realResponse = response as? NSHTTPURLResponse where
            realResponse.statusCode == 200 else 
                print("Not a 200 response")
                return
        

        // Read the JSON                
            let readableJSONFromWeb = JSON(data: data!, options: .MutableContainers, error: nil)
            var origin = readableJSONFromWeb["results"]
            print(origin)


    ).resume()

按照上面的代码,我得到了这个输出

Umair
[
 
  "id" : 
   "name" : "SSN",
   "value" : "026-36-3780"
 ,
"nat" : "US",
"cell" : "(862)-296-4803",
"phone" : "(528)-560-7652",
"login" : 
  "username" : "ticklishmouse295",
  "password" : "julie",
  "sha256" : "01234103cae3a10c5813a7c5dfd069e2533860cf2786df4dc31a501eb66b9c37",
  "sha1" : "46fa91a26c5219823b0c4a2c0fd99d390c997cd9",
  "salt" : "aU4VTMOV",
  "md5" : "be3f89edd4f22f333433d2424cbf4a95"
,
"registered" : 1144149087,
"dob" : 1170844810,
"picture" : 
  "large" : "https:\/\/randomuser.me\/api\/portraits\/women\/40.jpg",
  "thumbnail" : "https:\/\/randomuser.me\/api\/portraits\/thumb\/women\/40.jpg",
  "medium" : "https:\/\/randomuser.me\/api\/portraits\/med\/women\/40.jpg"
,
"location" : 
  "state" : "north carolina",
  "street" : "9402 mcclellan rd",
  "city" : "arvada",
  "postcode" : 93836
,
"email" : "ethel.palmer@example.com",
"gender" : "female",
"name" : 
  "title" : "mrs",
  "first" : "ethel",
  "last" : "palmer"


]

但是当我尝试使用某个特定字段时

var origin = readableJSONFromWeb["results","location"]

我得到 null 作为回报

【问题讨论】:

在你的远程访问中,你得到一个包含 JSON 的 NSData 对象,你不小心再次从带有NSData(contentsOfURL:url!)的url读取数据。您不需要这样做 - session.dataTaskWithURL 已经在响应中返回了 NSData 感谢您指出我的愚蠢错误。我尝试使用 session.dataTaskWithURL 返回的数据,但问题仍然存在 var origin = 可读JSONFromWeb["results"] var data = origin["location"] @Sanjeet verma 尝试了您的解决方案,但它仍然返回 null :-( 我现在使用 origin = readableJSONFromWeb["results",0,"location","postcode"] 【参考方案1】:

使用 SwiftyJSON 像这样下标:

var origin = readableJSONFromWeb["results","location"]

仅当整个路径由字典组成时才有效。

但是您的results 键包含一个数组,因此您必须传递要获取的数组项的索引。

从数组中获取第一项的示例:

var origin = readableJSONFromWeb["results",0,"location"]

结果:


  "city" : "sittard-geleen",
  "postcode" : 85004,
  "street" : "4774 pieterskerkhof",
  "state" : "flevoland"

【讨论】:

我得到了它的工作但不知道这个字典和数组的东西现在我明白了。感谢您的时间@EricD

以上是关于使用 SwiftyJSON 从 JSON 读取数据时返回 Null的主要内容,如果未能解决你的问题,请参考以下文章

SwiftyJSON 读取本地文件

如何使用 SwiftyJSON 框架读取本地声明的 JSON

使用 SwiftyJSON 读取本地 JSON 文件

使用 SwiftyJSON 读取 JSON 响应的子节点

SwiftyJSON - 无法从 JSON 字符串获取 transactionId

swiftyJSON 从 NSURL 解析 json