我试图将以下JSON发布到api。以下是来自Xcode控制台的日志。
{
address = (
{
city = 1;
area = 1;
"building_name" = "building";
}
);
category = 1;
inspection = 0;
subCategory = (
12
);
}
所以这里的地址字段是嵌套的JSON对象的数组。 问题是地址字段在服务器端没有正确获取。我认为它认为包括城市,区域等子字段作为单独的字典而不是整个字典。 以下是Laravel的日志。
array (
'address' =>
array (
0 =>
array (
'city' => '1',
),
1 =>
array (
'area' => '1',
),
2 =>
array (
'building_name' => 'building',
),
),
'category' => '1',
'inspection' => '0',
'subCategory' =>
array (
0 => '12',
),
)
基本上我想知道Alamofire是否试图将它们两次弄糊涂,但却无法避免它。 我使用Alamofire 4.7.2和Gloss 2.0,服务器端基于Laravel。
答案 0 :(得分:0)
无论你打印什么,它绝对是不是 JSON。尝试使用Codable
对象提供Alamofire方法,这可能如下所示(在Playground中):
import Cocoa
struct Address: Codable {
let city: Int
let area: Int
let building_name: String
}
struct Inspection : Codable {
let address: Address
let category: Int
let inspection: Int
let subCategory: [Int]
}
let inspection = Inspection(address: Address(city: 1, area: 1, building_name: "building"), category: 1, inspection: 0, subCategory: [12])
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
do {
let jsonData = try encoder.encode(inspection)
print(String(data: jsonData, encoding: .utf8)!)
} catch {
print(error)
}
这将打印出以下JSON:
{
"inspection" : 0,
"subCategory" : [
12
],
"category" : 1,
"address" : {
"building_name" : "building",
"city" : 1,
"area" : 1
}
}
大致与您上面提供的内容一致。不确定subCategory
应该是什么,所以我猜了一下。这种方法的优点在于,您通过JSONDecoder
获得了一个免费的JSON解析器,这真的非常棒。尝试从这里构建(或告诉我们你的输出应该代表什么)。
答案 1 :(得分:0)
这是因为我使用的是URLEncoding
,因此服务器端无法正确解析参数。切换到JSONEncoding
,它工作正常。
所以使用
JSONEncoding.default.encode(urlRequest, with: params)
而不是
URLEncoding.queryString.encode(urlRequest, with: params)