繁体   English   中英

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

[英]I have this issue when trying to read my data which is json encoded from the php page to the swift page

我在尝试读取从 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 周围的值无效。}

您收到此错误,因为您收到的 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

问题出在我的 php 端,我修复了它。它现在可以工作了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM