[当尝试读取从php页面到swift页面的json编码的数据时,我遇到了这个问题

问题描述 投票:0回答:1

[尝试读取从php页面到swift页面的json编码的数据时出现此问题。

这是我正在使用的代码

import Foundation

protocol HomeModelProtocol: class {
    func itemsDownloaded(items: NSArray)
}


class HomeModel: NSObject, URLSessionDataDelegate {

    //properties

    weak var delegate: HomeModelProtocol!

    var data = Data()

    let urlPath: String = "http://localhost/service.php" //this will be changed to the path where service.php lives
func downloadItems() {

        let url: URL = URL(string: urlPath)!
        let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)

        let task = defaultSession.dataTask(with: url) { (data, response, error) in

            if error != nil {
                print("Failed to download data")
            }else {
                print("Data downloaded") // this work fine

                self.parseJSON(data!)
            }

        }

        task.resume()
    }

func parseJSON(_ data:Data) {

    var jsonResult = NSArray()
    print(jsonResult) // this print empty parentheses


    print(String(data: data, encoding: .utf8)) // this prints out the array

    //the code below throughs an arror
   do{
    jsonResult = try JSONSerialization.jsonObject(with:data, options:JSONSerialization.ReadingOptions.allowFragments) as! [NSArray] as NSArray
        print(jsonResult)
    } catch let error as NSError {
        print(error)

    }



    var jsonElement = NSDictionary()
    let locations = NSMutableArray()

    for i in 0 ..< jsonResult.count
    {

        jsonElement = jsonResult[i] as! NSDictionary

        let location = LocationModel()

        //the following insures none of the JsonElement values are nil through optional binding
        if let name = jsonElement["Name"] as? String,
            let address = jsonElement["Address"] as? String,
            let latitude = jsonElement["Latitude"] as? String,
            let longitude = jsonElement["Longitude"] as? String
        {

            location.name = name
            location.address = address
            location.latitude = latitude
            location.longitude = longitude

        }

        locations.add(location)

    }

    DispatchQueue.main.async(execute: { () -> Void in

        self.delegate.itemsDownloaded(items: locations)

    })
}
}

这是我收到的输出:

Data downloaded

(
)

Optional(" \nconnectedinside[{\"name\":\"One\",\"add\":\"One\",\"lat\":\"1\",\"long\":\"1\"},{\"name\":\"Two\",\"add\":\"Two\",\"lat\":\"2\",\"long\":\"2\"},{\"name\":\"One\",\"add\":\"One\",\"lat\":\"1\",\"long\":\"1\"},{\"name\":\"Two\",\"add\":\"Two\",\"lat\":\"2\",\"long\":\"2\"}]")

错误域= NSCocoaErrorDomain代码= 3840“无效值字符2。“ UserInfo = {NSDebugDescription =无效值字符2。}

php json swift xcode
1个回答
1
投票

您会收到此错误,因为您收到的json响应不是数组而是字典。编辑:正如评论中指出的那样,您首先需要在php代码中修复json响应。在“ connectedinside”之后缺少“:”。它看起来应该像这样:{\"connectedinside\":[{\"name\":\"One\",\"add\":"One",...},...]}

我的修正建议:

您应该有两个模型:

struct HomeModelResponse: Codable {
   let connectedinside: [LocationModel]
}

// your LocationModel should look like this:
struct LocationModel: Codable {
   let name: String
   let add: String
   let lat: String
   let long: String
}

并将您的JSONDecoding代码更改为:

do {
   jsonResult = try? JSONDecoder().decode(HomeModelResponse.self, from: data)
   print()
} catch let exception {
   print("received exception while decoding: \(exception)"
}

然后您可以通过jsonResult.connectedinside访问您的LocationModels>

© www.soinside.com 2019 - 2024. All rights reserved.