如何使用Alamofire发布嵌套JSON?

时间:2016-12-08 07:35:02

标签: json swift alamofire

我想使用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,谢谢

2 个答案:

答案 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请求中使用此对象