将字典数组编码为 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.iduserDetails.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 数组发布为多个单条目字典

python2下解决json的unicode编码问题

Swift 将 JSON 转换为字典数组问题 错误代码 3840(末尾有垃圾)

将字典数组转换为 JSON 格式

从配置单元中的 JSON 数组获取 JSON 密钥时面临的问题

如何将数组数据编码为json?