【问题标题】:Parsing objects in Json array as a dictionary Swift将 Json 数组中的对象解析为字典 Swift
【发布时间】:2015-08-18 08:35:45
【问题描述】:

所以我有格式化为字典列表的 JSON 数据,并将其存储为 NSArray 对象,但我不确定当每个条目当前是 AnyObject 时如何将其转换为字典对象

AnyObject 数据已经像 JSON 字典一样格式化

这是我用来创建数组的代码

func startConnection(){
    let urlPath: String = "http://api.mtgdb.info/search/omni"
    var url: NSURL = NSURL(string: urlPath)!
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
    connection.start()




}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
    self.data.appendData(data)
}

func connectionDidFinishLoading(connection: NSURLConnection!){
    var err: NSError
    var jsonResult: NSArray = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSArray
    for var i = 0; i<jsonResult.count; ++i{
       ...

    }

}

【问题讨论】:

  • 所以你说你有这些字典存储在一个 NSArray 中。它们是数组中的 NSStrings 吗?还是它们是其他类型的对象,例如 NSDictionary?
  • 我用用于创建 NSArray 的代码编辑了我的帖子
  • 该 URL 返回的 JSON 是一个字典数组,因此您只需在访问外部数组元素时使用 as! NSDictionary

标签: ios json swift nsarray


【解决方案1】:

我尝试使用此示例代码来解决您的问题。 首先在网络浏览器中运行这个“http://api.mtgdb.info/search/omni” URL 并复制响应然后粘贴到“http://jsonlint.com”,响应是有效的,我得到 8 个字典的数组,比如 id:37113、39932、83737、106426、228247, 288937、382286、386302——8个数据。

在 Objective C 中,它运行良好,我得到与网络浏览器相同的结果。 但是在 Swift 中,它的行为很奇怪,不能解析整个响应,只能得到一半的字典作为数组的对象。只得到这么多的回应,

Printing description of jsonResult: ( { artist = "Arnie Swekel"; cardSetId = JUD; cardSetName = Judgment; colors = ( green, white ); convertedManaCost = 7; description = "Trample\nPhantom Nishoba enters the battlefield with seven +1/+1 counters on it.\nWhenever Phantom Nishoba deals damage, you gain that much life.\nIf damage would be dealt to Phantom Nishoba, prevent that damage. Remove a +1/+1 counter from Phantom Nishoba."; flavor = ""; formats = ( { legality = Legal; name = "Odyssey Block"; }, { legality = Legal; name = Legacy; }, { legality = Legal; name = Vintage; }, { legality = Legal; name = Freeform; }, { legal

我试过这个代码示例

class ViewController: UIViewController, NSURLConnectionDelegate {

var data:NSMutableData!
var arrvehicls:NSMutableArray!


override func viewDidLoad() {
    super.viewDidLoad()
    self.data = NSMutableData()
    self.arrvehicls = NSMutableArray()

    self.startConnection()
}

func startConnection(){
    let urlPath: String = "http://api.mtgdb.info/search/omni"
    var url: NSURL = NSURL(string: urlPath)!
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
    connection.start()
}

func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
    self.data.appendData(data)
}

func connectionDidFinishLoading(connection: NSURLConnection!) {

    var err: NSError
    var jsonResult:NSArray = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSArray

    for var i = 0; i<jsonResult.count; ++i {

        var dictResult = jsonResult.objectAtIndex(i) as! NSDictionary

        var vehicleInfo = Vehicle()
        vehicleInfo.id = dictResult.valueForKey("id") as! Int
        vehicleInfo.artist = dictResult.valueForKey("artist") as! String
        vehicleInfo.cardID = dictResult.valueForKey("cardSetId") as! String
        vehicleInfo.cardName = dictResult.valueForKey("cardSetName") as! String
        vehicleInfo.colors = dictResult.valueForKey("colors") as! NSArray
        vehicleInfo.details = dictResult.valueForKey("description") as! String
        vehicleInfo.flavour = dictResult.valueForKey("flavor") as! String
        vehicleInfo.formats = NSMutableArray()
        var arr = dictResult.valueForKey("formats") as! NSArray

        for var j = 0; j<arr.count; ++i {

            var dictFormats = arr.objectAtIndex(i) as! NSDictionary
            var formats = Formats()
            formats.legality = dictFormats.valueForKey("legality") as! String
            formats.name = dictFormats.valueForKey("name") as! String
            vehicleInfo.formats.addObject(formats)
        }
        self.arrvehicls.addObject(vehicleInfo)
    }
}
}

【讨论】:

  • 我不知道,我什至对这是怎么发生的感到困惑。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多