将字典数组编码为 JSON 时面临的问题
Posted
技术标签:
【中文标题】将字典数组编码为 JSON 时面临的问题【英文标题】:Facing Problem in encoding array of dictionary to JSON 【发布时间】:2018-10-12 10:36:21 【问题描述】:在 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."]
【问题讨论】:
失败?具体在哪里?jsonToRegistrer
也很奇怪,因为如果你返回一个字典,而不是任何,你也没有输入 "users"
。它至少应该是 let jsonToRegistrer = ["user": [["userid":userDetails.id, "meetAt":"Defalut Test Location at", "showFields":userDetails.showFields]]];
然后我希望你使用 AFNetworking 或任何其他已经调用 NSJSONSerialization
的库,因为它当前不是 JSON。
@Larme - 你是对的。我刚发现这个。我还更新了 OP 中的错误
【参考方案1】:
这是你的目标格式:
"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)")
【讨论】:
【参考方案2】:我个人会通过使用 struct thant 实现 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 协议。 希望对您有所帮助!
【讨论】:
以上是关于将字典数组编码为 JSON 时面临的问题的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 将 JSON 数组发布为多个单条目字典
Swift 将 JSON 转换为字典数组问题 错误代码 3840(末尾有垃圾)