2017-01-26 10 views
3

私はスウィフト辞書を構築する場合、すなわち[String: Any]はどのように私はJSONとすることを返すことができますか?私はこれを試みたが、それは私にエラーを与える:Argument labels '(node:)' do not match any available overloads蒸気JSON`辞書

drop.get("test") { request in 
    var data: [String: Any] = [:] 

    data["name"] = "David" 
    data["state"] = "CA" 

    return try JSON(node: data) 
} 
+0

nodeという名前の最初のパラメータを持つJSONという名前のメソッドはありません。 JSONがクラスの場合、最初のパラメータnodeを持つinitメソッドはありません。 – gnasher729

+0

Easier:let data = ["name": "David"、 "state": "CA"] – gnasher729

+0

JSONには、https://vapor.github.io/documentation/guide/jsonというinitメソッドがあります。 html#response – keegan3d

答えて

1

AnyNodeに変換できないため、JSONは[String : Any]辞書から初期化することはできません。

Nodeの種類は限られています。 (See Node source)。オブジェクトがすべて同じ型になることがわかっている場合は、その型だけを許可するディクショナリを使用します。したがって、あなたの例では、[String : String]です。

リクエストからデータを取得する場合は、ドキュメントhereのようにrequest.jsonを試してみてください。

EDIT:

(おそらくより良い)

別の解決策は、あなたの辞書[String: Node]を作るために、次にあなたがNodeに準拠する任意のタイプを含めることができるだろう。ただし、オブジェクトのmakeNode()関数を呼び出して辞書に追加する必要があります。

+0

まだ解決策はありませんか? – Alexi

2
一体として回旋

が、これは、あなたが[文字列:任意]を使用することができます:) .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())