无法将 JSON 转换为正确的格式

Posted

技术标签:

【中文标题】无法将 JSON 转换为正确的格式【英文标题】:Cannot convert JSON to the correct format 【发布时间】:2015-08-20 06:10:45 【问题描述】:

我想使用来自公共 Web 服务 https://api.rbp-zp.cz/1.3/services/district/ 的 JSON 输出,但在这种情况下,编码似乎存在问题。 AFNetworking 用于在这种情况下进行转换(通过特定的 respondSerializer),如下所示:

var op = AFHTTPRequestOperation (request: request)
        op.responseSerializer = AFJSONResponseSerializer()

但由于 JSON 结构无效而失败。

我尝试过自己进行转换,但没有结果

let rObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(decodedData, options:.AllowFragments, error: nil)

当我手动将此 JSON 从浏览器放入验证器 http://jsonlint.com 时,它说它的格式不正确。

奇怪的是,当我将日志中的 JSON 消息放入验证器时,结构是有效的。

任何帮助将不胜感激。

【问题讨论】:

json 文本末尾的  符号是什么? @Shoaib 你告诉我 :) 这很可能是编码混乱 把json文本末尾的“”去掉那么就是合法的json就会被转换过来。 @Vanya 这个问题属于服务器端,但不知道你是否可以访问web服务代码。 @Shoaib 你确定它在服务器端吗?我无法访问那里,但我可以让他们知道这方面存在问题。只是想确定一下。 【参考方案1】:
func convertStringToDictionary(text: String) -> [String:String]? 
    if let data = text.dataUsingEncoding(NSUTF8StringEncoding) 
        var error: NSError?
        let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as? [String:String]
        if error != nil 
            println(error)
        
        return json
    
    return nil


let str = "\"name\":\"James\""

let result = convertStringToDictionary(str) // ["name": "James"]

if let name = result?["name"]  // The `?` is here because our `convertStringToDictionary` function returns an Optional
    println(name) // "James"

在您的版本中,您没有将正确的参数传递给 NSJSONSerialization 并忘记转换结果。此外,最好检查可能的错误。最后一点:这仅在您的值是字符串时才有效。如果它可以是另一种类型,最好像这样声明字典转换:

let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as? [String:AnyObject]

当然你还需要改变函数的返回类型:

func convertStringToDictionary(text: String) -> [String:AnyObject]?  ... 

【讨论】:

谢谢,但事实并非如此,..我从服务器收到了错误的数据,想知道我是否可以对此采取任何措施。 用这个插件检查 crome chrome.google.com/webstore/detail/postman/…【参考方案2】:

好的,所以解决方法是最后修剪那些有趣的字符,..不太喜欢它但有效

let range:NSRange  = NSMakeRange(0, res.length - 3);
let refinedData:NSData = res.subdataWithRange(range)

let resObject = NSJSONSerialization.JSONObjectWithData(refinedData, options:NSJSONReadingOptions.allZeros, error: &error) as! NSArray

resObject 现在被正确填充为 NSArray

【讨论】:

以上是关于无法将 JSON 转换为正确的格式的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Json 转换为 NSDictionary? [关闭]

Spark:将 JSON 文件转换为正确的格式

在 Spark SQL 中,将 JSON 键名转换为值

将 SQL 结果转换为 JSON 的正确方法

通过 PHP 将 Sql 数据库转换为具有正确格式的 JSON,并在 PHP 脚本本身中对值进行排序

如何正确地将数据帧的所有日期时间列转换为 iso 格式