swift 1.2 中的 JSON 解析问题

Posted

技术标签:

【中文标题】swift 1.2 中的 JSON 解析问题【英文标题】:Trouble with JSON parsing in swift 1.2 【发布时间】:2016-08-09 06:35:37 【问题描述】:

我的 JSON 解析有问题,我的参数没有得到正确的数据响应。我已经在这个问题上停留了很长一段时间。我不知道如何解决它。我是 ios 开发的新手。我也没有使用任何第三方库。[不知道如何使用它们]

我的第一次迭代得到了正确的响应,但对于下一次迭代,前一次迭代的结果与新结果一起添加。就像每个循环结果都以上一次迭代的结果结束

我的 JSON SAMPLE。[可以提供链接,请告诉我]

struct AssetItems 
    
    var Name:String
    var Desc:String
    var Image:String
    var entityId:String
    
    var aFileType:String
    var aFileSize:String
    var aFileCreatedDate:String
    var aFileRevisionDate:String
    var aFileModifiedDate:String
    var aProductName:String
    var aVersion:String
    var aAssetType:String
    var aIsFolder:String
    
    init(assetName:String,assetDescription:String,assetImage:String,entityId:String,FileType:String,FileSize:String,FileCretedDate:String,FileReveisionDate:String,FileModifiedDate:String,ProductName:String,Version:String,AssetType:String,IsFolder:String) 
        
        
        
        self.Name = assetName
        self.Desc = assetDescription
        self.Image = assetImage
        self.entityId = entityId
        self.aFileType = FileType
        self.aFileSize = FileSize
        self.aFileCreatedDate = FileCretedDate
        self.aFileRevisionDate = FileReveisionDate
        self.aFileModifiedDate = FileModifiedDate
        self.aProductName = ProductName
        self.aVersion = Version
        self.aAssetType = AssetType
        self.aIsFolder = IsFolder
    




struct AssetModel 
    var aName:String
    var aDesc:String
    var aCount:String
    var aEntityId:String
    var items:[AssetItems]
    
    init(rackName:String,rackDescription:String,totalNoAssets:String,EntityId:String,rackItems:[AssetItems]) 
        self.aName = rackName
        self.aDesc = rackDescription
        self.aCount = totalNoAssets
        self.aEntityId = EntityId
        self.items = rackItems
    
    


  
var assetData:Array<AssetModel> = Array<AssetModel>()
var assetContents:Array<AssetItems> = Array<AssetItems>()

这就是我解析 JSON 的方式

 func get_data_from_Url(url:String) 
        
        
        let url = NSURL(string: url)
        var request:NSMutableURLRequest = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "GET"
        
        request.addValue("application/json", forHTTPHeaderField: "Content_Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        
        
        var responseError : NSError?
        var response : NSURLResponse?
        
        var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &responseError)
        
        if(urlData != nil) 
            
            var responseData:NSString = NSString(data: urlData!, encoding: NSUTF8StringEncoding)!
            let res = response as! NSHTTPURLResponse
            var err:NSError?
            if (res.statusCode == 200)
            
                var parseError: NSError?
                let json:AnyObject = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &err) as AnyObject!
                if (parseError == nil) // no error while parsing
                
                    if let Asset_list = json as? NSArray
                    
                    for (var i = 0; i < Asset_list.count ; i++ )
                    
                    if let Asset_obj = Asset_list[i] as? NSDictionary
                    
                    if let AssetGroupName = Asset_obj["Name"] as? String
                    
                    if let AssetGroupDescription = Asset_obj["Description"] as? String
                    
                    if let entityId = Asset_obj["EntityId"] as? String
                    
                    if let totalAssets = Asset_obj["_NoOfAssets"] as? String
                    
                    if let items = Asset_obj["Items"] as? NSArray
                    
                    for (var j=0 ; j < items.count; j++)
                    
                    if let asset_items = items[j] as? NSDictionary
                    
                    if let AbsolutePath = asset_items["AbsolutePath"] as? String
                    
                    if let Description = asset_items["_Description"] as? String
                    
                    if let Name = asset_items["_Name"] as? String 
                    if let entityId = asset_items["EntityId"] as? String
                    
                    if let FileType = asset_items["_FileType"] as? String
                    
                    if let FileSize = asset_items["_FileSize"] as? String
                    
                    if let FileCreatedDate = asset_items["CreatedDate"] as? String
                    
                    if let FileModifiedDate = asset_items["ModifiedDate"] as? String
                    
                    if let RevisionDate = asset_items["RevisionDate"] as? String
                    
                    if let productName = asset_items["ProductName"] as? String
                    
                    if let version = asset_items["Version"] as? String
                    
                    if let AssetType = asset_items["_AssetType"] as? String
                    
                    if let isFolder = asset_items["IsFolder"] as? String
                    
                        
                                                                                                                    
                var add = AssetItems(assetName: Name, assetDescription: Description, assetImage: AbsolutePath, entityId: entityId, FileType: FileType, FileSize: FileSize, FileCretedDate: FileCreatedDate, FileReveisionDate: RevisionDate, FileModifiedDate: FileModifiedDate, ProductName: productName, Version: version, AssetType: AssetType, IsFolder: isFolder)
                    assetContents.append(add)

                        
                        
                        
                        
                        
                       
                    
                    
                   
                
                
                                                                    
                
                
                        
                
                        
                
            var add_it = AssetModel(rackName: AssetGroupName, rackDescription: AssetGroupDescription, totalNoAssets: totalAssets, EntityId: entityId, rackItems: assetContents)
                assetData.append(add_it)
                        
                        
                    
                                            
                    
                        
                    
                        
                    
                        
                    
                    
                    
                
                
            
        
        
        
        
        do_table_refresh()
    

func do_table_refresh()
    
        dispatch_async(dispatch_get_main_queue(),
            
                self.tableView.reloadData()
                
        )
        
        return
    

我的输出

请有人帮我解决这个问题,任何建议也可以。

谢谢

【问题讨论】:

如果您是 Swift 新手,请不要从该语言的过时版本开始。最新版本是 2.2,Swift 3 将在几周内发布。并考虑符合命名约定:变量名总是以小写字母开头,并且没有 php/javascript 下划线分隔符。 感谢您的回复,我很久以前就开始了这个项目,现在我无法改变整个事情...... 你不能或者你不想? ;-) @vadian:不,先生,这实在是太麻烦了。将来我肯定会使用最新版本。 您可以考虑将您的代码发送到 thedailywtf.com。 【参考方案1】:

特别感谢@SMi,借助他的 GuidLines,我能够解决我的问题。 我知道我必须在循环结束时清除内部数组[但是,不知道如何清除。]

 var add_it = AssetModel(rackName: AssetGroupName, rackDescription: AssetGroupDescription, totalNoAssets: totalAssets, EntityId: entityId, rackItems: assetContents)
       assetData.append(add_it)
assetContents.removeAll()

我所要做的就是使用 .removeAll() 方法来清除 assetContents 数组。

【讨论】:

以上是关于swift 1.2 中的 JSON 解析问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 JSON 解析

Swift 3 中的 JSON 解析

如何正确解析 SWIFT 中的 JSON 对象

JSON 解析 --> Swift | JSON 写入中的***类型无效

Swift 中的 JSON 解析(iOS)

Swift 3.0 中的 JSON 解析失败