问题
使用系统框架将字典转成压缩转义后的JSON字符串,发现字符串中带有多个换行符。
系统转JSON的方法如下:
let json = try JSONSerialization.jsonObject(with: validData, options: options)
例:Alamofire框架里面字典转JSON字符串的方法
public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var urlRequest = try urlRequest.asURLRequest()
guard let parameters = parameters else { return urlRequest }
do {
let data = try JSONSerialization.data(withJSONObject: parameters, options: options)
if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
urlRequest.httpBody = data
} catch {
throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))
}
return urlRequest
}
字典在控制台打出来如下:
["Data": {
ArrayOfAdds = (
);
ArrayOfDeletes = (
);
ArrayOfUpdates = (
{
ItemCode = x9336;
LineNum = 5;
Quantity = "2.0";
WarehouseCode = 235;
},
{
ItemCode = x9336;
LineNum = 6;
Quantity = "5.0";
WarehouseCode = 235;
}
);
DocEntry = 26774;
Finalize = 0;
Type = PurchaseOrder;
}]
POST请求将这个字典传到Alamofire框架后,在let data = try JSONSerialization.data(withJSONObject: parameters, options: options)
下一行断点,输出序列换之后的JSON字符串,结果控制台会输入带空格和换行的JSON字符串
po String(data: data, encoding: String.Encoding.utf8)
▿ Optional<String>
- some : " { "Data" : { "Finalize" : false, "ArrayOfUpdates" : [ { "WarehouseCode" : "235", "Quantity" : "5.0", "ItemCode" : "x9336" },
- { "WarehouseCode" : "235", "Quantity" : "2.0", "ItemCode" :
- x9336" } ], "Type" : "PurchaseOrder", "DocEntry" : 26774, "ArrayOfDeletes" : [ ], "ArrayOfAdds" : [ ] }}"
原因
导致这样的原因是在调用request方法时候,设置的参数encode的类型是JSONEncoding.prettyPrinted,如果选择这个,Alamofire框架里面在进行字典转JSON的时候会设置 let data = try JSONSerialization.data(withJSONObject: parameters, options: options)
处options的值为1,就会出现转成JSON之后有空格和换行符的情况。
task.request = sessionManager?.request(url!, method: method, parameters: paramters, encoding: JSONEncoding.default, headers: self.headers).responseJSON { response in
task.handleResponse(response: response)
}
可以在如下代码中断点调试看看
public init(options: JSONSerialization.WritingOptions = []) {
self.options = options
}
根本原因还是在使用序列化JSON的方法的时候传不同的值,会有不同的情况。
JSONSerialization.data(withJSONObject: parameters, options: options)
如果option传0的话,系统默认会取消所有的换行符和空格,如果传1的话默认不做处理。在使用Alamofire发送请求时,需要注意encoding字段的设置,这会影响到框架里面序列化options字段的值。
解决
JSONSerialization.data(withJSONObject: parameters, options: options)
options参数传0即可。
如果使用Alamofire进行传参数发现的这个问题的话,将encoding字段的值改成JSONEncoding.default即可。