来自json的响应字节数组

Posted

技术标签:

【中文标题】来自json的响应字节数组【英文标题】:Response byte array from json 【发布时间】:2018-06-13 11:43:52 【问题描述】:

如何从服务器响应字节数组并将其转换为图像。这是我的代码 enter image description here

Alamofire.request(mainUrl, method:.post , parameters: paramstring , encoding: JSONEncoding.default, headers: nil).responseJSON  response in
        if let data = response.data
        
            switch response.result
            
            case.failure(let error):
            print(error)
            case.success(let value):
                let json = JSON(value)
                guard let dataarr = json["my_profile"].arrayObject as? [String] else return
                let image = dataarr[0]
                let mydata = image.data(using: String.Encoding.utf8)! as NSData
                print(mydata)
                let mybase64 = mydata.base64EncodedData(options: NSData.Base64EncodingOptions.endLineWithLineFeed)
                print(mybase64)
                self.MainView.avatarImageView.image = UIImage(data: mybase64)

            
        

如你所见,它不是字节数组,它继续 1000 行 enter image description here

【问题讨论】:

你能粘贴你收到的json数据吗? 这是JSON的一小部分,因为你可以看到它不是字节数组“my_profile”:[“\\ xffd8ffe000104a46494600010101006000600000ffdb00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101ffdb00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101ffc000110803c0050003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191 - 跨度> 你可以试试这个代码,因为它是部分数据***.com/a/38313261/2323806 我试过了,还是不行 这里我有一个问题,服务器上的数据与我响应的数据不同,我尝试将响应字符串转换为字节数组,但我得到了相同的结果,太奇怪了:/ 【参考方案1】:

您的数据不是 Base64 编码的。它是十六进制编码的。您需要对其进行十六进制解码,而不是使用base64EncodedData

首先,您需要删除前两个字符 (\x):

let hex = dataarr[0].dropFirst(2)

那么你需要一种将十六进制转换为数据的方法。有很多方法。这是一个:

extension Data 
    init?<S: StringProtocol>(hexString: S) 
        guard hexString.count % 2 == 0 else  return nil   // Must be even number of letters

        var bytes: [UInt8] = []

        var index = hexString.startIndex
        while index != hexString.endIndex 
            let secondIndex = hexString.index(after: index)
            let hexValue = hexString[index...secondIndex]
            guard let byte = UInt8(hexValue, radix: 16) else  return nil  // Unexpected character
            bytes.append(byte)
            index = hexString.index(after: secondIndex)
        
        self.init(bytes)
    

有了它,解码它:

if let data = Data(hexString: hex),
   let image = UIImage(data: data) 
       // ... use image

【讨论】:

YOOOO MAN,你是我的英雄,非常感谢,我努力解决这个问题 3 天【参考方案2】:

替换你的代码

let mydata = image.data(using: String.Encoding.utf8)! as NSData
print(mydata)
let mybase64 = mydata.base64EncodedData(options: NSData.Base64EncodingOptions.endLineWithLineFeed)
print(mybase64)
self.MainView.avatarImageView.image = UIImage(data: mybase64)

if let mydata : Data = Data(base64Encoded: image, options: .ignoreUnknownCharacters) 
   DispatchQueue.main.async 
       self.MainView.avatarImageView.image = UIImage(data: mydata)
    


【讨论】:

不工作(也许我的json响应有问题,你能检查一下吗? @ЧингизКуандык 您的if let mydata : Data = 条件是否为真意味着您的打印数据显示任何内容? @ЧингизКуандык 在主队列中尝试 我在描述中添加了我的项目图片 @ЧингизКуандык print(myData) 正在执行?

以上是关于来自json的响应字节数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fuel 和 Result 将字节数组转换为 Json

WebAPI中发送字节数组

如何获取通用地图作为来自 restTemplate 交换方法的响应?

使用Javascript从rest读取字节数组响应

将字节数组放入 JSON,反之亦然

记录来自 NAudio WaveIn 的输入,并将输出保存到字节数组