首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift3和JSON

Swift3和JSON
EN

Stack Overflow用户
提问于 2016-10-23 17:23:42
回答 2查看 156关注 0票数 0

我试图从我的服务器解析JSON,但我得到了奇怪的行为。

这是我的网络处理代码:

代码语言:javascript
复制
import Foundation


// Input: URLRequest
// Output: returns JSON or raw data


public let DANetworkingErrorDomain = "\(Bundle.main.bundleIdentifier!).NetworkingError"
public let MissingHTTPResponseError: Int = 10
public let UnexpectedResponseError: Int = 20

class NetworkProcessing{

let request: URLRequest
lazy var configuration: URLSessionConfiguration = URLSessionConfiguration.default
lazy var session: URLSession = URLSession(configuration: self.configuration)


init(request: URLRequest) {
    self.request = request
}


//Construct a URLSEssion and download data and return the data

// This is multi Threading

typealias JSON = [String : Any]
typealias JSONHandler = (JSON?, HTTPURLResponse?, Error?) -> Void
typealias DataHandler = (Data?, HTTPURLResponse?, Error?) -> Void


func downloadJSON(completion: @escaping JSONHandler){
    let dataTask = session.dataTask(with: self.request) {
        (data, response, error) in

        //Off the main Thread
        //Error: missing http response

        guard let httpResponse = response as? HTTPURLResponse else {
            let userInfo = [NSLocalizedDescriptionKey : NSLocalizedString("Missing HTTP Response", comment: "")]

            let error = NSError(domain: DANetworkingErrorDomain, code: MissingHTTPResponseError, userInfo: userInfo)

            completion(nil, nil, error as Error)
            return
        }


        //There was a response but no data
        if data == nil {
            if let error = error{
                completion(nil, httpResponse, error)
            }
          //We have some data
        }else{
            switch httpResponse.statusCode{

            case 200:
                //Everything is good Parse the JSON into Foudation Object (array, dictionary..)
                do{
                    let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any]
                    completion(json, httpResponse, nil)
                } catch let error as NSError {
                    // The JSON data isn't correct
                    completion(nil, httpResponse, error)
                }

                break


             // Any other http status code other than 200
            default:
                print ("Recieved HTTP response code: \(httpResponse.statusCode) = was not handeled in NetworkProcessing.swift")
                break

            }
        }


    }

    dataTask.resume()
}



// This is raw data not JSON
func downloadData(completion: @escaping DataHandler) {
    let dataTask = session.dataTask(with: self.request) {
        (data, response, error) in

        //Off the main Thread
        //Error: missing http response

        guard let httpResponse = response as? HTTPURLResponse else {
            let userInfo = [NSLocalizedDescriptionKey : NSLocalizedString("Missing HTTP Response", comment: "")]

            let error = NSError(domain: DANetworkingErrorDomain, code: MissingHTTPResponseError, userInfo: userInfo)

            completion(nil, nil, error as Error)
            return
        }


        //There was a response but no data
        if data == nil {
            if let error = error{
                completion(nil, httpResponse, error)
            }
            //We have some data
        }else{
            switch httpResponse.statusCode{

            case 200:
                //Everything is good Parse the JSON into Foudation Object (array, dictionary..)
                completion(data, httpResponse, error)
                break


            // Any other http status code other than 200
            default:
                print ("Recieved HTTP response code: \(httpResponse.statusCode) = was not handeled in NetworkProcessing.swift")
                break

            }
        }


    }

    dataTask.resume()

}
}

然后我这样叫它:

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

    let baseURL = "http://www.example.com/api/"
    let path = "business.php?tag=getBusCategories"
    let urlString = "\(baseURL)\(path)"

    let url = URL(string: urlString)!
    let urlRequest = URLRequest(url: url)
    let networkProcessing = NetworkProcessing(request: urlRequest)

    networkProcessing.downloadJSON { (json, httpResponse, error) in
        print(json)
        if let dictionary = json {

            if let busCategoriesDict = dictionary["busCategories"] as? [String : Any]{
                let busCatName = busCategoriesDict["busCatName"]
                print("********************\(busCatName)*****************")
            }
        }
    }
}
}

然后,我在检查器中得到以下输出:

代码语言:javascript
复制
Optional(["busCategories": <__NSArrayI 0x6080000a7440>(
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 1;
    busCatName = Accommodation;
},
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 3;
    busCatName = "Bars & Restaurants";
},
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 17;
    busCatName = Beauty;
},
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 4;
    busCatName = Computer;
},
{
    busCatDescription = Description;
    busCatId = 18;
    busCatName = Conference;
},
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 6;
    busCatName = Entertainment;
},
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 11;
    busCatName = "Pets & Animals";
},
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 12;
    busCatName = Services;
},
{
    busCatDescription = "Some description Some Description Some Description";
    busCatId = 10;
    busCatName = Stores;
},
{
    busCatDescription = Description;
    busCatId = 19;
    busCatName = Weddings;
}
)
, "success": 1, "error": 0])

我的问题是:

代码语言:javascript
复制
  ["busCategories": <__NSArrayI 0x6080000a7440>(

//the JSON looks like this:

{
    "error": false,
    "success": 1,
    "busCategories": [
        {
            "busCatId": "1",
            "busCatName": "Accommodation",
            "busCatDescription": "Some description Some Description Some Description"
        }, {
        "busCatId": "19",
        "busCatName": "Weddings",
        "busCatDescription": "Description"
    }
]
}

我真的不明白为什么iOS不能正确地解析JSON,而且现在我不能引用busCategories

EN

回答 2

Stack Overflow用户

发布于 2016-10-23 17:55:08

如果我的理解正确的话,

dictionary["busCategories"]

不是String:Any,而是[String:Any],换句话说,它是字典的and数组,而不是字典,因此

if let busCategoriesDict = dictionary["busCategories"] as? [String : Any]

永远不会成功。

票数 0
EN

Stack Overflow用户

发布于 2016-10-23 18:15:32

不能正确解析iOS的不是JSON。那就是你。;-)

正如您从输出中所看到的那样

可选([“busCategories”:<__NSArrayI 0x6080000a7440>

busCategories是一个数组。

使用您的类型别名JSON来清楚地说明这一点。

代码语言:javascript
复制
if let dictionary = json {
    if let busCategoriesArray = dictionary["busCategories"] as? [JSON] {
        for busCategory in busCategoriesArray {
           let busCatName = busCategory["busCatName"] as! String
           print(busCatName)
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40201407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档