2016-11-21 4 views
0

私は、高速リクエストをHTTP要求で送信できるように、スピーディオブジェクトを辞書に変換するシリアライザメソッドを使用しています。スウィフトディクショナリは、[String]タイプの値のキーの後に角括弧を追加します。

この特定の方法は

class func toDictionary (_ order: Order) -> Dictionary<String, Any> { 
    return [ 
     "products" : NSArray(array:order.getProducts()), 
     "owning_user" : NSString(string: order.getOwningUser()), 
     "restaurant" : NSString(string: order.getRestaurantId()) 
    ] 
} 

order.getProducts(私に問題を与えるものであるが)タイプの配列を返し[文字列]

私はそれとして送られるHTTPリクエストにこれを送信する場合

{"products[]":["...","..."], 
"restaurant":"sdfsdf" 
} 

明らかに、私のサーバーは製品をキーとして期待しているため、適切な値が得られません。

角括弧が追加されている理由はありますか?

注:alamofire

EDITを経由して

私のHTTP要求が行われています。

で問題が判明がalamofire

としたソリューション

+0

'toDictionary'は正しい値を返します(余分な角かっこは付きません)?その辞書をJSONオブジェクトにも変換すれば? – Larme

+0

@Larme toDictionaryは、余分な角括弧なしで辞書を返します。 Alamofireは辞書の形式でしかパラメータを受け付けないので、辞書をJSONオブジェクトに変換することはできません – mwild

答えて

1

を示し、これはhttpBodyとして辞書を渡すときalamofireのエンコーディングに関係する問題であるが判明。同じ問題を抱えて誰のための

Alamofire.request(requestURL, method: .post, parameters: orderJson, encoding: JSONEncoding.default) 

を次のように、最終的な要求が見え、それがもたらすあなたのAlamofireポスト要求

encoing: JSONEncoding.default 

に次のプロパティを追加することでこの問題を解決次のJSONが投稿されました

{ restaurant: '580e33ee65b84973ffbc7beb', 
    products: [ '580f5cdafaa1067e55be696d' ], 
    owning_user: '580e2d174e93b0734e9a04cb' 
} 

私が元々望んでいたとおりです。

0

は以下を参照してください[OK]を、これが表示されますここで働くためには、私はあなたのやり方が何であるかについてより多くの文脈が必要だと思います。これで問題が解決したら、投票してください!ありがとう! 考えられる問題。別の配列内に配列があるかもしれませんか? order.getProducts()がすでに配列を返す場合は、別の配列に配置しないでください。もう一つのオプションは、.flatMapすることです "NSArray(array:order.getProducts())。flatMap {$ 0}" < <は、配列の配列から単一の配列を作成します。デバッグエリアの

//: Playground - noun: a place where people can play 

import UIKit 

func toDictionary() -> Dictionary<String, Any> { 
    return [ 
     "products" : NSArray(array:["Paper","Pencil","Eraser"]), 
     "owning_user" : NSString(string: "user2976358"), 
     "restaurant" : NSString(string: "TacoBell") 
    ] 
} 


let rValue = toDictionary() 

let jsonData:Data! 
do { 
jsonData = try JSONSerialization.data(withJSONObject: rValue, options: .prettyPrinted) 
    let newString = String(data: jsonData, encoding: .utf8) 
    print(newString!) 
} catch 
{ 
    print(error) 
} 

の結果は、この

{ 
    "restaurant" : "TacoBell", 
    "products" : [ 
    "Paper", 
    "Pencil", 
    "Eraser" 
    ], 
    "owning_user" : "user2976358" 
} 
+0

order.getProducts()は配列yesを返します。しかし、それは文字列で遊んでいるAlamoFireかもしれないようです。あなたがそこに言うように、それは正しいjsonオブジェクトをもたらしません。さらに問題になるのは、配列に1つの値しかない場合、配列内に単一の値を持つ配列ではなく、辞書の中に単一の値として置くことです – mwild

関連する問題