如果我构建一个Swift字典,即[String: Any]
如何将其作为JSON返回?我试过这个,但它给了我错误:Argument labels '(node:)' do not match any available overloads
。
drop.get("test") { request in
var data: [String: Any] = [:]
data["name"] = "David"
data["state"] = "CA"
return try JSON(node: data)
}
答案 0 :(得分:2)
如同heck一样,但是这允许你使用[String:Any] .makeNode(),只要内部是NodeRepresentable,NSNumber或NSNull :) -
import Node
enum NodeConversionError : LocalizedError {
case invalidValue(String,Any)
var errorDescription: String? {
switch self {
case .invalidValue(let key, let value): return "Value for \(key) is not NodeRepresentable - " + String(describing: type(of: value))
}
}
}
extension NSNumber : NodeRepresentable {
public func makeNode(context: Context = EmptyNode) throws -> Node {
return Node.number(.double(Double(self)))
}
}
extension NSString : NodeRepresentable {
public func makeNode(context: Context = EmptyNode) throws -> Node {
return Node.string(String(self))
}
}
extension KeyAccessible where Key == String, Value == Any {
public func makeNode(context: Context = EmptyNode) throws -> Node {
var mutable: [String : Node] = [:]
try allItems.forEach { key, value in
if let _ = value as? NSNull {
mutable[key] = Node.null
} else {
guard let nodeable = value as? NodeRepresentable else { throw NodeConversionError.invalidValue(key, value) }
mutable[key] = try nodeable.makeNode()
}
}
return .object(mutable)
}
public func converted<T: NodeInitializable>(to type: T.Type = T.self) throws -> T {
return try makeNode().converted()
}
}
使用该标题,您可以:
return try JSON(node: data.makeNode())
答案 1 :(得分:1)
无法从[String : Any]
字典初始化JSON,因为Any
无法转换为Node
。
Node可以只有有限数量的类型。 (See Node source)。如果您知道您的对象都是相同的类型,请使用仅允许该类型的字典。因此,对于您的示例,[String : String]
。
如果您要从请求中获取数据,可以尝试使用文档here中使用的request.json
。
另一个(可能更好的)解决方案是制作您的字典[String: Node]
,然后您可以包含符合Node
的任何类型。您可能必须调用对象的makeNode()
函数将其添加到字典中。