Alamofire + Gloss: вложенный массив JSON не работает - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь опубликовать следующий 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 4.7.2 и Gloss 2.0, а серверная часть основана на Laravel.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Это было из-за того, что я использовал URLEncoding, поэтому серверная сторона не могла правильно проанализировать параметры. Переключился на JSONEncoding и все заработало нормально.

Так что используйте

JSONEncoding.default.encode(urlRequest, with: params)

вместо

URLEncoding.queryString.encode(urlRequest, with: params)
0 голосов
/ 05 мая 2018

Что бы вы ни распечатывали, это определенно , а не JSON. Попробуйте снабдить ваши методы Alamofire объектами Codable, это может выглядеть следующим образом (на игровой площадке):

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 должен был быть, поэтому я предположил. Прелесть этого подхода в том, что вам предоставляется бесплатный JSON-парсер через JSONDecoder, что действительно здорово. Попробуйте построить отсюда (или скажите нам, что ваш вывод должен представлять).

...