如何合并来自循环的多个单独 json 结果然后 return swift
How to combine multiple seperate json results from loop then return swift
我想将 3 个 json 个结果合并为一个以便稍后循环。
我已经尝试了互联网上的每一个组合,但我仍然陷入了死胡同。我正在调用 API 调用作为响应,接收 json 数据。我想获得前 3 个结果和 return 那个数据到调用方法但是,我只是找不到找到所需响应的方法。
var data: JSON = []
func getData(forKey url: URL, completion: @escaping ([JSON]) -> Void){
AF.request(url).responseJSON { (responseData) -> Void in
if((responseData.result.value) != nil) {
let swiftyJsonVar = JSON(responseData.result.value!)
for loopID in 0 ... 2{
print(swiftyJsonVar["results"][loopID])
}
}
return completion([self.data])
}
}
我想要的结果是
[
{
"name": "james",
"location": "Mars"
},
{
"name": "james",
"location": "Mars"
},
{
"name": "james",
"location": "Mars"
}
]
在我的循环中,当我收到 x 3
{
"name": "james",
"location": "Mars"
}
对于初学者,我会放置一个断点,然后从您遇到的任何端点来看您的响应对象是什么样的。也许那些真的是数组的前三个元素?
继续手头的事情,我会使用 Codable
协议来解码您的回复。我将跳过 Alamofire 部分,只专注于解码对象。使用您的示例,结构如下所示:
struct ResponseObject: Codable {
let name: String
let location: String
}
我会避免在你的代码中使用 bang 运算符 (!
),因为如果你告诉编译器它是 100% 保证银行里的钱对象不是 nil 而它实际上是是。相反,解包选项。
您需要一个用于解码数据的着陆点,因此您可以声明一个空的响应数组,如下所示:
var arrayOfObjects: [ResponseObject] = []
然后,您只需声明一个解码器并解码您的数据:
let decoder = JSONDecoder()
do {
if let data = rawData {
arrayOfObjects = try decoder.decode([ResponseObject].self, from: data)
print("number of objects:", arrayOfObjects.count)
let slice = arrayOfObjects.prefix(3)
arrayOfObjects = Array(slice)
print("number of objects after slicing the array:", arrayOfObjects.count)
}
} catch {
print(error)
}
不用遍历数组,只需用 .prefix(3)
获取数组的前三个元素。刚才摆弄这个,我尝试用 4 为数组的前 10 个元素添加前缀,但它没有生成异常,所以我认为这应该可以在不首先检查数组计数的情况下工作。
我建议看一下 Swift 在线文档 re: Arrays 或者你可以得到一个非常棒的 Mac OS 应用程序叫 Dash,它可以让你加载文档集本地计算机上的一堆语言。
祝你好运!
我想将 3 个 json 个结果合并为一个以便稍后循环。
我已经尝试了互联网上的每一个组合,但我仍然陷入了死胡同。我正在调用 API 调用作为响应,接收 json 数据。我想获得前 3 个结果和 return 那个数据到调用方法但是,我只是找不到找到所需响应的方法。
var data: JSON = []
func getData(forKey url: URL, completion: @escaping ([JSON]) -> Void){
AF.request(url).responseJSON { (responseData) -> Void in
if((responseData.result.value) != nil) {
let swiftyJsonVar = JSON(responseData.result.value!)
for loopID in 0 ... 2{
print(swiftyJsonVar["results"][loopID])
}
}
return completion([self.data])
}
}
我想要的结果是
[
{
"name": "james",
"location": "Mars"
},
{
"name": "james",
"location": "Mars"
},
{
"name": "james",
"location": "Mars"
}
]
在我的循环中,当我收到 x 3
{
"name": "james",
"location": "Mars"
}
对于初学者,我会放置一个断点,然后从您遇到的任何端点来看您的响应对象是什么样的。也许那些真的是数组的前三个元素?
继续手头的事情,我会使用 Codable
协议来解码您的回复。我将跳过 Alamofire 部分,只专注于解码对象。使用您的示例,结构如下所示:
struct ResponseObject: Codable {
let name: String
let location: String
}
我会避免在你的代码中使用 bang 运算符 (!
),因为如果你告诉编译器它是 100% 保证银行里的钱对象不是 nil 而它实际上是是。相反,解包选项。
您需要一个用于解码数据的着陆点,因此您可以声明一个空的响应数组,如下所示:
var arrayOfObjects: [ResponseObject] = []
然后,您只需声明一个解码器并解码您的数据:
let decoder = JSONDecoder()
do {
if let data = rawData {
arrayOfObjects = try decoder.decode([ResponseObject].self, from: data)
print("number of objects:", arrayOfObjects.count)
let slice = arrayOfObjects.prefix(3)
arrayOfObjects = Array(slice)
print("number of objects after slicing the array:", arrayOfObjects.count)
}
} catch {
print(error)
}
不用遍历数组,只需用 .prefix(3)
获取数组的前三个元素。刚才摆弄这个,我尝试用 4 为数组的前 10 个元素添加前缀,但它没有生成异常,所以我认为这应该可以在不首先检查数组计数的情况下工作。
我建议看一下 Swift 在线文档 re: Arrays 或者你可以得到一个非常棒的 Mac OS 应用程序叫 Dash,它可以让你加载文档集本地计算机上的一堆语言。
祝你好运!