没有数组的Swift Json数据解析

Posted

技术标签:

【中文标题】没有数组的Swift Json数据解析【英文标题】:Swift Json data parsing without array 【发布时间】:2016-08-08 12:59:52 【问题描述】:

我有工作 json 数据解析 array 代码,但我想将其更改为 Dictionary 解析。我的新 json 文件


  "Id": 450,
  "Name": "NameforItem",
  "Image": "234234.jpg"

我的旧 json 文件工作成功

[
  "Id": 450,
  "Name": "NameforItem",
  "Image": "234234.jpg"
]

我的解析代码。

 /// Convert JSON data into  array
    private func getFromJSON(jsonData: NSData) throws -> [Place] 
        var places = [Place]()
        do 
            if let jsonArray = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .AllowFragments) as? [[String: AnyObject]] 
                for i in jsonArray 
                    var properties = [String: AnyObject]()
                    properties[placeJSONKeys.Id] = i[placeJSONKeys.Id]
                    properties[placeJSONKeys.Name] = i[placeJSONKeys.Name]
                    let place = Place(properties: properties)
                    places.append(place)
                
            
         catch 
            throw TMDBErrors.ParsingError
        
        return places
    

谢谢!

【问题讨论】:

【参考方案1】:

我建议您将函数的返回类型更改为Optional:

private func getFromJSON(jsonData: NSData) throws -> Place? 
    var place: Place?
    do 
        if let json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .AllowFragments) as? [String: AnyObject] 
            var properties = [String: AnyObject]()
            properties[placeJSONKeys.Id] = json[placeJSONKeys.Id]
            properties[placeJSONKeys.Name] = json[placeJSONKeys.Name]
            place = Place(properties: properties)
        
     catch 
        throw TMDBErrors.ParsingError
    
    return place

更新

 private func getFromJSON(jsonData: NSData) throws -> Place? 
    var place: Place?
    do 
        if let json = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .AllowFragments) as? [String: AnyObject] 


            place = Place(properties: json)
        
     catch 
        throw TMDBErrors.ParsingError
    
    return place

【讨论】:

@Shadow Of Worked Ty 我会尽快批准的 @SwiftDeveloper - 一个问题,也检查一个更新的答案 @Anbu.Karthik 谢谢 @SwiftDeveloper - placeJSONKeys 的原因是结构类,你可以在任何地方直接访问对象 @Anbu.Karthik 是的,我明白了,谢谢!【参考方案2】:

[[String: AnyObject]] 更改为[String: AnyObject],因为现在它是字典而不是数组

do 
    if let jsonDic = try NSJSONSerialization.JSONObjectWithData(jsonData, options: .AllowFragments) as? [String: AnyObject] 
        print(jsonDic["Id"])
        print(jsonDic["Name"])
        print(jsonDic["Image"])
    
 catch 
    throw TMDBErrors.ParsingError

【讨论】:

为什么要增加内存,你可以直接访问JSonarray字典,这里不需要循环

以上是关于没有数组的Swift Json数据解析的主要内容,如果未能解决你的问题,请参考以下文章

将 swift 数组解析为有效的 json

Swift 和 JSON 只解析一个对象而不是一个数组

Swift JSON 解析访问数组

从 GET 请求中解析 JSON 数组 Alamofire Swift 2

使用swift解析包含索引的json数据?

如何使用新的 Swift 3 和 Alamofire 解析 JSON(字典和数组)