2016-12-08 2 views
0

Я хочу использовать Alamofire (V3.5.1), и я использую Swift (V2.3). JSON, я хочу опубликовать это.Как POST вложенный JSON с использованием Alamofire?

{ 
    "inputs": [ 
    { 
     "image": { 
     "dataType": 50, 
     "dataValue": "base64_image_string" 
     }, 
     "configure": { 
     "dataType": 50, 
     "dataValue": "{\"side\":\"face\"}" 
     } 
    } 
    ] 
} 

И я пытаюсь сделать Alamofire параметры как этот

let parameters : [String: AnyObject] = [ 
     "inputs" : [ 
     [ "image":[ 
      "dataType":50, 
      "dataValue":(base64String) 
      ], 
      "configure":[ 
      "dataTpye":50, 
       "dataValue": ["side" :"face"] 
      ] 
      ] 
     ] 
    ] 

Но результат я получаю это. FAILURE: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0.

Q1: Как я могу отправить POST правильный вложенный json в тело?

EDIT: Я попытался использовать способ @Zonily Jame для создания объекта JSON, но он не удался. Вот мой код:

 let imageData:[String:AnyObject] = ["dataType":50, "dataValue":"string"] 
    let configureData:[String:AnyObject] = ["dataType":50, "dataValue":"{\"side\":\"face\"}"] 
    let inputsData:[String:AnyObject] = ["image":dictToJSON(imageData) , "configure":dictToJSON(configureData)] 
    let parameters:[String:AnyObject] = ["inputs":dictToJSON(inputsData)] 

и я распечатал переменную parameters, которая выглядит следующим образом:

["inputs": { 
    configure =  { 
     dataType = 50; 
     dataValue =   { 
      side = face; 
     }; 
    }; 
    image =  { 
     dataType = 50; 
     dataValue = ""; 
    }; 
}] 

Каким-то синтаксис является неверным. И я также попытался использовать dictToJSON() по переменной configureData, я все равно получил тот же результат.


ожидаемый ответ должен быть

{ 
    "outputs": [ 
    { 
     "outputLabel": "ocr_id", 
     "outputMulti": {}, 
     "outputValue": { 
     "dataType": 50, 
     "dataValue": "{\"address\": \"string\", \"config_str\" : \"{\"side\":\"face\"}\", \"name\" : \"Jack\",\"num\" : \"1234567890\", \"success\" : true}" 
     } 
    } 
    ] 
} 

EDIT: Это документ в API, о том, как фраза ответа, но в JAVA

try { 
      JSONObject resultObj = new JSONObject(result); 
      JSONArray outputArray = resultObj.getJSONArray("outputs"); 
      String output = outputArray.getJSONObject(0).getJSONObject("outputValue").getString("dataValue"); 
      JSONObject out = new JSONObject(output); 
      if (out.getBoolean("success")) { 
       String addr = out.getString("address"); 
       String name = out.getString("name"); 
       String num = out.getString("num"); 
       System.out.printf(" name : %s \n num : %s\n address : %s\n", name, num, addr); 
      } else { 
       System.out.println("predict error"); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

и код запроса

public static JSONObject getParam(int type, JSONObject dataValue) { 
     JSONObject obj = new JSONObject(); 
     try { 
      obj.put("dataType", type); 
      obj.put("dataValue", dataValue); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return obj; 
    } 


    public static JSONObject getParam(int type, String dataValue) { 
     JSONObject obj = new JSONObject(); 
     try { 
      obj.put("dataType", type); 
      obj.put("dataValue", dataValue); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return obj; 
    } 

     JSONObject requestObj = new JSONObject(); 
     try { 
      JSONObject configObj = new JSONObject(); 
      JSONObject obj = new JSONObject(); 
      JSONArray inputArray = new JSONArray(); 
      configObj.put("side", configStr); 
      obj.put("image", getParam(50, imgBase64)); 
      obj.put("configure", getParam(50, configObj.toString())); 
      inputArray.put(obj); 
      requestObj.put("inputs", inputArray); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     String body = requestObj.toString(); 

ПРИМЕЧАНИЕ: imgBase64 - это строка.

Q2: Как я могу анализировать этот вид JSON? Я просто хочу dataValue, спасибо

+0

Вы можете разместить свои коды Alamofire? ** Примечание: ** вы можете скрыть URL-адрес при необходимости mate –

+0

Параметры, которые вы получили, были правильными imo, в вашем 'api' вы уверены, что сервер создан для приема параметров' application/json' параметров? Я не понимаю, что вы имеете в виду после того, как «И я хочу получить ответ», можете ли вы перефразировать? –

+0

@ZonilyJame Я имею в виду, что сервер даст мне этот ответ, это правильный пример в документе API. И я использую этот метод Alamofire 'Alamofire.request (.POST, url, Параметры: параметры, кодировка: .JSON , заголовки: заголовки) .responseJSON ' – Shucheng

ответ

0

Что вы должны сделать, это сначала преобразовать ваш Dictionaries/Arrays внутри вашей Super Dictionary на объект JSON

Например давайте объект

let object = [ 
    "franchise": [ 
     "name": "Marvel", 
     "movies": ["Doctor Strange", "Iron Man", "Spider Man"] 
    ] 
] 

для этой работы мы должны разделить эти объекты, которые будут примерно выглядеть следующим образом (только что сделал это для удобства чтения)

let movies:[String] = ["Doctor Strange", "Iron Man", "Spider Man"] 

let franchiseDetails:[String:AnyObject] = [ 
    "name": "Marvel", 
    "movies": movies 
] 
let franchise:[String:AnyObject] = [ 
    "franchise": franchiseDetails 
] 

А затем просто превратить их в объект JSON с помощью NSJSONSerialization с помощью этих функций

func dictToJSON(dict:[String: AnyObject]) -> AnyObject { 
    let jsonData = try! NSJSONSerialization.dataWithJSONObject(dict, options: .PrettyPrinted) 
    let decoded = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: []) 
    return decoded 
} 

func arrayToJSON(array:[String]) -> AnyObject { 
    let jsonData = try! NSJSONSerialization.dataWithJSONObject(array, options: .PrettyPrinted) 
    let decoded = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: []) 
    return decoded 
} 


let newObject = [ 
    "franchise": dictToJSON([ 
     "name": "Marvel", 
     "movies": arrayToJSON(["Doctor Strange", "Iron Man", "Spider Man"]) 
    ]) 
] 

Теперь вы можете использовать этот объект в вашем Alamofire Request

+0

Спасибо за ваш ответ, это очень полезно. И у меня есть другой вопрос: как добавить эту строку в словарь? '" dataValue ":" {\ "side \": \ "face \"} "Я очень смущен. – Shucheng

+0

Предполагается, что это словарь в словаре? –

+0

Я не уверен. Это пример запроса API – Shucheng

1

вы можете указать словарь вложенных словарей или вы можете сделать отдельный словарь для каждой клавиши, требующей словаря. нравится [AnyObject: AnyObject].

Для анализа ключа вы можете преобразовать ответ в словарной форме и использовать его метод valueforKeyPath

+0

, но 'Alamofire.request' нужны параметры как [String: AnyObject] , поэтому я не могу сделать свое тело как [AnyObject: AnyObject]. И я знаю, как анализировать нормальный json, но я не знаю, как анализировать nest json как '" dataValue ":" {\ "address \ ": \" string \ ", \" config_str \ ": \" {\ "side \": \ "face \"} \ ", \" name \ ": \" Jack \ ", \" num \ ": \ "1234567890 \", \ "success \": true} "Вы можете мне помочь? – Shucheng

+0

if let jsonResult = response as? NSDictionary { let OrderObjectIds = jsonResult.value (forKeyPath: "result.objectId")} – rohit

+0

использовать "outputs.outputValue.dataValue" in in keyPath – rohit

Смежные вопросы