我想使用Alamofire(V3.5.1),我使用的是Swift(V2.3)。我要发布的JSON就是这个。
{
"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:如何在正文中发布正确的嵌套json?
编辑:我尝试使用@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}"
}
}
]
}
编辑:这是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 :(得分:1)
您可以提供嵌套词典的字典类型,也可以为每个需要字典的键创建单独的字典。 比如[AnyObject:AnyObject]。
对于键的分析,您可以转换字典形式的响应并使用其方法valueforKeyPath
答案 1 :(得分: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
]
然后通过使用NSJSONSerialization
使用这些函数将它们转换为JSON对象
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请求中使用此对象