json - Swift 可编码对象数组
问题描述
我正在尝试将 Swift Encodable 结构呈现为以下 JSON:
{
"userID": 1000142,
"emergencyContactData": {"contact":
[
{"firstName": "John"},
{"lastName": "Doe"},
{"email": "john.doe567@gmail.com"},
{"phone": "12345678901"}
]
}
}
我尝试了以下方法:
struct UserEmergencyContactRequest: Encodable {
var userID: String
var ecData: EmergencyContactData
}
struct EmergencyContactData: Encodable {
var contact: [[String: String]]
}
但是,单个 String:String 字典条目不会呈现到 JSON 对象(没有花括号)。我将如何更改 [String: String] 条目,以便在将其呈现为 JSON 结构时,单个 String: String 值将包含在一组 JSON 花括号中?
注意:不,我无法更改服务以接受更好的格式,处理遗留服务。
解决方案
结构正确
我认为问题在于您填充结构的方式(未在您的问题中显示)。
错误
这是我猜你正在使用的错误代码。
具体来说,错误在于您填充
dictionaries
值的方式。事实上,您正在创建一个数组,其中包含一个包含所有值的字典。相反,您应该创建一个字典数组,其中每个字典都有 1 个条目。
let dictionaries = [["firstName" : "John", "lastName": "Doe", "email": "john.doe567@gmail.com", "phone": "12345678901"]]
let ecData = EmergencyContactData(contact: dictionaries)
let elm = UserEmergencyContactRequest(userID: "userID", ecData: ecData)
if
let data = try? JSONEncoder().encode(elm),
let string = String(data: data, encoding: .utf8) {
print(string)
}
{"userID":"userID","ecData":{"contact":[{"email":"john.doe567@gmail.com","firstName":"John","lastName":"Doe","phone":"12345678901"}]}}
修复
如上所述,让我们尝试将 1 个条目放入每个字典中。
let dictionaries = [["firstName" : "John"], ["lastName": "Doe"], ["email": "john.doe567@gmail.com"], ["phone": "12345678901"]]
let ecData = EmergencyContactData(contact: dictionaries)
let elm = UserEmergencyContactRequest(userID: "userID", ecData: ecData)
if let data = try? JSONEncoder().encode(elm),
let string = String(data: data, encoding: .utf8) {
print(string)
}
现在我们得到了预期的结果。
{"userID":"userID","ecData":{"contact":[{"firstName":"John"},{"lastName":"Doe"},{"email":"john.doe567@gmail.com"},{"phone":"12345678901"}]}}
推荐阅读
- ldap - 将 LexikJWTAuthenticationBundle 与 LDAP 提供程序一起使用
- sql - 仅当另一列具有特定值时才允许 Null
- swiftui - SwiftUI 错误:无法推断通用参数“标签”显式指定通用参数以解决此问题`
- c - C struct 初始化在编译时初始化的数组元素的数量
- date - .csv 中的 Google Sheets 浮点数成为 .xls 中的日期
- c# - .NET CLR 是否预先计算属性值?
- sybase - 将 IN 子句与 List agg 一起使用。功能
- pandas - 将每组的计算值重置为第一个值
- pyspark - 如何在 pyspark 中的许多列之间应用相同的操作
- c++ - C++ 单个 Makefile 多个二进制文件