Alamofire + Gloss:嵌套的JSON数组不起作用

时间:2018-05-05 11:19:55

标签: swift post alamofire nsurlrequest gloss

我试图将以下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。

2 个答案:

答案 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)