反馈json格式错误

Posted

技术标签:

【中文标题】反馈json格式错误【英文标题】:Feedback json format wrong 【发布时间】:2017-12-27 12:14:33 【问题描述】:

这是我的反馈 json 字符串:

"name":"abc", "cardNumber":"1234567890", "data": [A data,B data...] 

我用这个函数发送数据,然后获取json和encode:

func uploadData(word:String)
    var request = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30)
    request.httpMethod = "POST"
    request.httpBody = word.data(using: .utf8)
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let session = URLSession(configuration: URLSessionConfiguration.default)
    session.dataTask(with: request, completionHandler: (data, response, error) in
        if let data = data
            do
            let data = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)
                print(data) //I want to know what is this so I print
            catch
                print(error.localizedDescription)
            
        
    ).resume()

但控制台总是说:The data couldn't be read because it isn't in the correct format

如果我使用JSONObject.getJSONArray("myValue")...,这个json可以在android中格式化和读取 我尝试使用print(data)(没有json编码)来显示反馈中是否有任何数据,并且我在控制台中得到400字节,所以我确定有数据发回给我。 更新 12/28:
"name":"abc",
 "cardNumber":"1234567890",
 "data": [day:20171228, time: 09:10:11,
          day:20171226, time: 20:00:12,
          day:20171227, time: 15:30:22
         ]
 

我确定这个json可以在android中读取,我使用的接收方和发送方是vb.net,它使用sendingString = JsonConvert.SerializeObject(JSONClass)变成json字符串,然后转换成字节发送出去。

更新 12/28 新 经过这么多尝试,我发现string可以得到反馈,但是name的值是中文单词,其他值是英文和数字,只有name不可读,现在我正在检查哪个String.Encoding可以工作,然后如果我编码成功,我会尝试格式化为 json 数组。

【问题讨论】:

你能打印完整的 JSON 吗? 您确定您的网络服务返回正确的 JSON 格式吗?我的意思是您是获得成功结果还是返回任何其他数据(错误字符串?) @MidhunMP 我尝试使用 String 来获取反馈将返回 nil,还有一件有趣的事情我仍然无法找出为什么会发生这种情况:如果我使用 seesion.uploadTask 和 @987654332 @ ,我可以得到反馈并阅读,但是结果是 "name":, "cardNumber":, "data": ,json中没有任何值,直到这个,我仍然无法弄清楚为什么下载会发送未知数据来请求下载... @SucharuHasija 我更新了完整的 json 字符串,谢谢~ 这是因为你的 JSON 实际上是无效的。 daytime 键应该被引用,就像这样 "day": "20171228", "time": "09:10:11" 不同的 JSON 解析器对数据施加不同的有效性检查。如果你不能改变服务器,你最好的办法是找到一个可以接受这个无效数据的 JSON 库 【参考方案1】:

你可以试试这个吗?

func uploadData(word:String)
var request = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30)
request.httpMethod = "POST"
request.httpBody = word.data(using: .utf8)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let session = URLSession(configuration: URLSessionConfiguration.default)
session.dataTask(with: request, completionHandler: (data, response, error) in
    if let data = data
          if let returnData = String(data: data!, encoding: .utf8) 
          print(returnData)
           else 
          print("Invalid Data Coming")
         

        do
        let data = try JSONSerialization.jsonObject(with: data, options: []) as?  [String: AnyObject]
            print(data) //I want to know what is this so I print
        catch
            print(error.localizedDescription)
        
    
).resume()

【讨论】:

将选项更改为 []?控制台仍然显示The data couldn't be read because it isn't in the correct format. 我已更新代码并尝试从您的数据中获取字符串信息。您能告诉我打印值中显示的内容吗? 您能说出您发送的确切 URL 和 JSON 吗?我将据此更新答案。希望有意义 String 得到Invalid Data Coming,json 得到The data couldn't be read because it isn't in the correctt format。我认为导致格式不正确的原因之一是name的值是中文单词,在android中我使用BIG5读取反馈然后我可以得到值。 在 JSON 格式中没有类似的东西。为什么不呢,你用 almanofire 来完成同样的任务

以上是关于反馈json格式错误的主要内容,如果未能解决你的问题,请参考以下文章

打印物流单显示格式错误不是json格式

json格式错误怎样解决?

springboot统一返回json数据格式并配置系统异常拦截

DandelionException:文件'resources/.......json'格式错误

从 jQuery Ajax 发布时 PHP Json 格式错误

PayPal REST API 格式错误的 JSON 错误