gpt4 book ai didi

ios - URLSession 成功,但返回空 JSON 数据编辑 JSON 解析问题

转载 作者:行者123 更新时间:2023-11-30 11:32:28 24 4
gpt4 key购买 nike

我正在开发一个 iOS 应用程序,并使用 Swift 4 来开发它。该应用程序将利用 REST 调用来填充选择器和表格。下面的代码已用于成功处理调用,但是现在,我没有收到任何数据。 REST 已通过 postman 进行了测试,这给了我预期的结果。

typealias JSONCompletionHandler = (Data?, Int?, Error?) -> void

static function getData(completionHandler: @escaping JSONCompletionHandler){
let url = URL(string: "http://apiurl.com")
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
let htttResponse = response as? HTTPURLResponse

completeionHandler(data, httResponse?,statuscode, error)
}
task.resume()
}

编辑

下面是 HTTPURLResponse 的打印输出

Headers {
"Cache-Control" = (
"no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
);
Connection = (
"Keep-Alive"
);
"Content-Type" = (
"application/json; charset=utf-8"
);
Date = (
"Tue, 01 May 2018 15:44:27 GMT"
);
Expires = (
"Thu, 19 Nov 1981 08:52:00 GMT"
);
"Keep-Alive" = (
"timeout=5, max=100"
);
Pragma = (
"no-cache"
);
Server = (
"Apache/2.2.29 (Win32) mod_ssl/2.2.29 OpenSSL/0.9.8zf"
);
"Set-Cookie" = (
"ZDEDebuggerPresent=php,phtml,php3; path=/"
);
"Transfer-Encoding" = (
Identity
);
"X-Powered-By" = (
"ZendServer 8.0.2"
);
} }

apache连接日志

申请

  • [2018年5月2日:09:51:04 +0100]“GET/public/rest/catalogue-standard-fit/HTTP/1.1”200 15669
  • [2018年5月2日:09:51:04 +0100]“GET/public/rest/catalogue-multi-fit/HTTP/1.1”200 14302
  • [2018年5月2日:09:51:04 +0100]“GET/public/rest/catalogue-accessory/HTTP/1.1”200 216

postman

10.2.13.221 - - [02/May/2018:09:52:55 +0100]“GET/public/rest/catalogue-accessory/HTTP/1.1”200 216

编辑

正在返回数据,问题在于用于解析 JSON 数据的方法。

我正在使用 swift 4 中提供的 Codable 方法,下面使用的结构以及 JSON 数据输出的方式(来自 postman )

//Structures for JSON
struct PartType: Codable {
let id: String
let name: String
}

struct Availability: Codable {
let id: String
let status: String
}

struct AccessorySearch: Codable {
let part_type = [PartType]()
let availability = [Availability]()

}

来自 POSTMAN 的 JSON 数据

{
"part_type": [
{
"id": "1",
"name": "Type 1"
},
{
"id": "2",
"name": "Type 2"
},
{
"id": "3",
"name": "Type 3"
}
],
"availability": [
{
"id": "1",
"status": "In Stock"
},
{
"id": "2",
"status": "In Development"
},
{
"id": "3",
"status": "Not in Stock"
}
]
}

使用方法

    private func jsonDecodeString(data: Data?) {


// array of the above structures
paryTypeArrayStructure.insert(PartType(id: "0", name: "Select Option"), at: 0)
availabilityArrayStructure.insert(Availability(id: "0", status: "Select Option"), at: 0)

let decoder = JSONDecoder()
do {

let decodeAccessories = try decoder.decode(AccessorySearch.self, from: data!)
print("PART TYPE: ",decodeAccessories.part_type)
print("AVAILABILITY: ",decodeAccessories.availability)

let json = try JSONSerialization.jsonObject(with: data!, options: []) as! [String: AnyObject]

print(json)

for item in decodeAccessories.availability {
print(item)
availabilityArrayStructure.append(item)
}

for item in decodeAccessories.part_type {
paryTypeArrayStructure.append(item)
}

//print(availabilityArrayStructure)
} catch let jsonErr {
print ("Failed to decode: ", jsonErr)
displayErrorMessage(message: "[RCCA003 JSONException occurred when reading the response from server]")
}

}

我尝试了 JSONSerilization 并能够解析数据。所以现在我的问题是,为什么我最初的尝试解析失败了?对于造成的任何困惑,我深表歉意,你们都提供了很大的帮助,所以谢谢你们。

编辑 - 找到解决方案...但为什么它有效?

首先,我要感谢所有评论并提供研究领域的人。事实证明 JSON 解析以及我如何设置结构存在问题。

//Structures for JSON
struct PartType: Codable {
let id: String?
let name: String?
}

struct Availability: Codable {
let id: String?
let status: String?
}

struct AccessorySearch: Codable {

let part_type: [PartType]
let availability: [Availability]
}

将解析part_type数组和可用性数组的结构将其变量设置为可选。这允许解析 JSON。有人能解释一下吗?为什么这个简单的改变会起作用?再次感谢。

最佳答案

我使用以下 Playground 来说明您的(小)故障:

import Cocoa

let jsonData = """
{
"part_type": [
{
"id": "1",
"name": "Type 1"
},
{
"id": "2",
"name": "Type 2"
},
{
"id": "3",
"name": "Type 3"
}
],
"availability": [
{
"id": "1",
"status": "In Stock"
},
{
"id": "2",
"status": "In Development"
},
{
"id": "3",
"status": "Not in Stock"
}
]
}
""".data(using: .utf8)!

struct PartType: Codable {
let id: String
let name: String
}

struct Availability: Codable {
let id: String
let status: String
}

struct AccessorySearch0: Codable {
let part_type = [PartType]()
let availability = [Availability]()
}

struct AccessorySearch: Codable {
let part_type: [PartType]
let availability: [Availability]
}

do {
let accessory = try JSONDecoder().decode(AccessorySearch.self, from: jsonData)
print(accessory)
} catch {
print(error)
}

我使用了第二个版本中的 AccessorySearch 以及第一个版本中的 PartTypeAvailability。这解析得很完美,所以我认为一切都很好。

但是,您的 AccessorySearch 的第一个版本(为了便于比较,我将其命名为 AccessorySearch0)是一种不同的动物。它不仅定义一个类,它还初始化它。由于它使用 let 定义其属性,因此第一个分配不能再更改,并且您从 JSONDecoder 获得的将是一个具有空数组的对象。

正如我所说,这只是一个小故障。

关于ios - URLSession 成功,但返回空 JSON 数据编辑 JSON 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50120108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com