【问题标题】:Feedback json format wrong反馈json格式错误
【发布时间】: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 库

标签: ios json swift


【解决方案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 来完成同样的任务
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2018-06-24
  • 2016-10-28
相关资源
最近更新 更多