将集合字典强制转换为JSON对象

将集合字典强制转换为JSON对象,json,swift,dictionary,Json,Swift,Dictionary,我正试图构建如下表单所示的请求主体: { "user": { "id": 1, "id": 2, "id": 4 } } 我的第一个想法是从字符串构建json,并将其转换为字典字符串和任意字符串,但这个解决方案有一个问题。通过JSONSerialization步骤进行转换时缺少一些“id” 我尝试使用: var dictionary: [String : Any] = ["name" : "John"]() var select

我正试图构建如下表单所示的请求主体:

{
    "user": {
        "id": 1, 
        "id": 2,
        "id": 4
    }
}
我的第一个想法是从字符串构建json,并将其转换为字典字符串和任意字符串,但这个解决方案有一个问题。通过JSONSerialization步骤进行转换时缺少一些“id”

我尝试使用:

var dictionary: [String : Any] = ["name" : "John"]()
var selectedIDs = Set<NSDictionary>()

// Adding values to selectedIDs set
let userIDDict = ["id" : id] as NSDictionary
selectedIDs.insert(userIDDict)

dictionary.updateValue(selectedIDs, forKey: "user")
var字典:[String:Any]=[“name”:“John”]()
var selectedIDs=Set()
//向SelectedDS集合添加值
让userIDDict=[“id”:id]作为NSDictionary
选择edids.insert(userIDDict)
dictionary.updateValue(selectedIDs,forKey:“用户”)
但是JSONSerialization不能强制转换它(JSON写入中的类型无效)。
如何解决我面临的问题?

创建此请求不是问题;它不是正确的JSON,所以您不应该尝试使用
JSONSerialization
。它只是一个字符串,因此您可以创建该字符串:

let idKeyValues = ids.map { "\"id\": \($0)" }.joined(separator: ",\n        ")

let request = """
{
    "user": {
        \(idKeyValues)
    }
}
"""
==>

用JSON表达这一点的正确方式是:

{
    "user": {
        "ids": [1, 2, 4]
    }
}

有了它,
Codable
实现应该非常简单。

这不是有效的JSON,所以普通的JSON序列化程序不会生成它。不能有多个相同的键names@Adrian
Codable
将不会生成此输出。(更清楚地说,JSON规范RFC 8259确实允许重复密钥。它只是指出发生的情况不可预测,解析器之间无法互操作。不幸的是,这是一种间接的说法,表示这是未定义的行为。)您还可以使用一个名为“id”的数组,
“id”:[1,2,4]
{
    "user": {
        "ids": [1, 2, 4]
    }
}