iOS字典转成JSON换行符问题

问题

使用系统框架将字典转成压缩转义后的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即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值