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 解析问题的主要内容,如果未能解决你的问题,请参考以下文章