将字典数组编码为 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.id
和 userDetails.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 协议。
希望对您有所帮助!
在 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."]}
这是你的目标格式:
{
"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 协议。 希望对您有所帮助!