将字典数组编码为 JSON 时遇到问题

Facing Problem in encoding array of dictionary to JSON

在 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.iduserDetails.showFields 具有有效值,但仍然失败。

错误:

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

这是你的目标格式:

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

在其上调用 JSONSerialization 之后(或者如果您的代码接受 Dictionary/Array 并自行进行翻译):

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)")

我个人会通过使用 struct thant implements Codable 来避免这个问题。由于您没有 Any 类型或递归字段的任何值,因此这应该很容易工作

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

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

然后你只需要在 Users.users 中绑定 User 就可以轻松地对其进行编码

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

This article 可能会帮助您更好地理解 Codable 协议。 希望对您有所帮助!