2015-05-22 18 views
5

Mam problem ze strukturowaniem moich parametrów, aby nasz interfejs API serwera mógł odczytać go jako prawidłowy JSON.Jak używać tablic JSON z parametrami Alamofire?

Alamofire wykorzystuje parametry jak ten w szybkim języku

let parameters : [String: AnyObject] = 
[ 
    "string": str 
    "params": HOW I INSERT A VALID JSON ARRAY HERE 
] 

Problemem jest to, że AnyObject nie wydaje się akceptować JSON tak jak bym wysłać/tworzyć strukturę jak ta z szybkich?

{ 
"string": str, "params" : [ 
    { 
     "param1" : "something", 
     "param2" : 1, 
     "param3" : 2, 
     "param" : false 
    }, 
    { 
     "param1" : "something", 
     "param2" : 1, 
     "param3" : 2, 
     "param" : false 
    }] 
} 
+2

Co masz wywołanie „tablicę JSON” tu jest tylko tablicą słowników. Nie jest to JSON, dopóki Alamofire nie zaszyfruje go do JSON-a na żądanie. – mattt

Odpowiedz

5

Zrobione ze strony Alamofire „s GitHub:

let parameters = [ 
    "foo": [1,2,3], 
"bar": [ 
    "baz": "qux" 
] 
] 

Alamofire.request(.POST, "http://httpbin.org/post", parameters: parameters, encoding: .JSON) 
// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} 

EDIT: A z przykładu:

let parameters = [ 
    "string": "str", 
"params": [[ 
    "param1" : "something", 
    "param2" : 1, 
    "param3" : 2, 
    "param" : false 
],[ 
    "param1" : "something", 
    "param2" : 1, 
    "param3" : 2, 
    "param" : false 
] 
] 
] 
+1

To nie odpowiada dokładnie na moje pytanie. To nie jest tak, że zamierzam zakodować kod JSON w parametry. Bar w tym przykładzie jest także Słownikiem akceptowanym przez AnyObject, a nie tablicą JSON. –

+0

Do edycji: Prawidłowo, trochę, ale nadal muszę wstawić "parametry" jako obiekt, a nie na sztywno zakodowaną strukturę. –

+4

@MiikaPakarinen Nie ma znaczenia, czy wartość jest zakodowana na stałe, czy skonstruowana w inny sposób. – mattt

1

rozwiązał ten sam. Mogę po prostu zrobić:

parameters = 
    [ 
     "params": array 
    ] 

Gdzie jest tablica Dictionary (String, AnyObject). Problem, który początkowo miałem z tym rozwiązaniem, polegał na tym, że nie można wstawiać bajtanów do tego rodzaju słownika, zostaną one po prostu przekształcone w liczby całkowite. Ale najwyraźniej kodowanie alamofire JSON (jak sądzę) przesyła je jako wartości prawdziwe/fałszywe.

0

Musisz utworzyć obiekt NSArray dla parametrów tablicy.

var yourParameters = [ 
    "String": "a string", 
    "Int": 1, 
    "Array": NSArray(
    array: [ 
     "a", "b", "c" 
    ]) 
] 
0

jeśli używasz SwiftyJSON, możesz napisać jak to

let array = ["2010-12-13T5:03:20","2010-12-13T5:03:20"] 
let paramsJSON = JSON(array) 
var arrString = paramsJSON.rawString(NSUTF8StringEncoding) 
0

Swift 2.2 i stosując SwiftyJSON.swift
można używać w takim stanie.

var arrayList : [String: AnyObject]//one item of array 

    var list: [JSON] = []//data array 

    for i in 0..<10//loop if you need 
    { 

     arrayList = [ 
      "param1":"", 
      "param1":"", 
      "param2":["","",""] 
     ] 

     list.append(JSON(arrayList))//append to your list 

    } 


    //params 
    let params: [String : AnyObject]=[ 

     "Id":"3456291", 
     "List":"\(list)"//set 
    ] 
0

W przypadku, gdy istnieje potrzeba przekazania tablicy bezpośrednio jako parametr dla żądania alamofire, dla mnie zadziałała następująca metoda.

źródło: https://github.com/Alamofire/Alamofire/issues/1508

let headers = NetworkManager.sharedInstance.headers 
var urlRequest = URLRequest(url: URL(string: (ServerURL + Api))!) 
urlRequest.httpMethod = "post" 
urlRequest.allHTTPHeaderFields = headers 
let jsonArrayencoding = JSONDocumentArrayEncoding(array: documents) 
let jsonAryEncodedRequest = try? jsonArrayencoding.encode(urlRequest, with: nil) 

    var request: Alamofire.DataRequest? = customAlamofireManager.request(jsonAryEncodedRequest!) 
    request?.validate{request, response, data in 
     return .success 
     } 
     .responseJSON {