Столкнувшись с проблемой при кодировании массива словаря в JSON - PullRequest
0 голосов
/ 12 октября 2018

В запросе POST я должен отправить следующие данные JSON

{
    "users": [{"userid": 16, "meetAt":"Some place (College/trip etc)", "showFields": "11111111000"}, {"userid": 17, "meetAt":"Some place (College/trip etc)", "showFields": "11111111001"}]
}

Я пытаюсь

static func linkRequestBody(userDetails: ScannedContact) -> Any
{

    let jsonToRegistrer =  [["userid":userDetails.id, "meetAt":"Defalut Test Location at", "showFields":userDetails.showFields]];
    return jsonToRegistrer;
}

Я вижу в отладчике, что userDetails.id и userDetails.showFields имеют допустимые значенияно все равно не получается.

ОШИБКА:

{"":["The input was not valid."]}

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я бы лично избежал этой проблемы, используя struct thant реализует Codable.Поскольку у вас нет значения типа Any или рекурсивного поля, это должно работать очень легко

struct Users: Codable {
    var users: [User]
}

struct User: Codable {
    let userid: Int
    let meetAt: String
    let showFields: String
}

Тогда вам просто нужно связать User в Users.users, чтобы легко его кодировать, используя

do {
    let json = try? JSONEncoder().encode(Users)
} catch { // whatever you want }

Эта статья может помочь вам лучше понять протокол Codable.Надеюсь, это поможет!

0 голосов
/ 12 октября 2018

Это ваш целевой формат:

{
    "users": [{
        "userid": 16,
        "meetAt": "Some place (College/trip etc)",
        "showFields": "11111111000"
    }, {
        "userid": 17,
        "meetAt": "Some place (College/trip etc)",
        "showFields": "11111111001"
    }]
}

После вызова JSONSerialization для него (или если ваш код принимает словарь / массив и выполняет сам перевод):

let jsonToRegistrer =  [["userid":userDetails.id, "meetAt":"Defalut Test Location at", "showFields":userDetails.showFields]];

Должно представлять, что:

[{
    "userid": 16,
    "meetAt": "Defalut Test Location at",
    "showFields": "11111111000"
}]

Вы видите проблему?Ваша версия - Array, а целевая - Dictionary, и вам так не хватает клавиши users.

Чтобы исправить это:

let jsonToRegistrer =  ["user": [["userid":userDetails.id, "meetAt":"Defalut Test Location at", "showFields":userDetails.showFields]]];

Вы также не можетенапишите это в одну строку, чтобы было понятнее:

let jsonToRegistrer = ["user": [
                                 ["userid": userDetails.id,
                                  "meetAt": "Defalut Test Location at",
                                  "showFields": userDetails.showFields]
                                ]
                        ];

Таким образом, проблема в том, что ваша версия не имела того же формата, что и необходимый.

Чтобы увидеть, какая ваша версия отображается вJSON вы можете использовать:

let jsonData = try? JSONSerialization.data(withJSONObject: jsonToRegistrer, options: .prettyPrinted)
let jsonString = String(data: jsonData!, encoding: .utf8) //Note it's a force unwrap but just to debug, avoid using force unwrap
print("jsonString: \(jsonString)")
...