Swift - 检查JSON是否有效

10
let data = NSData(contentsOfFile: "myfile")
let jsonString = NSString(data: data, encoding: NSUTF8StringEncoding)
let jsonData: NSData! = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
var validJson = false

if (NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) != nil) {
    validJson = true
}
我希望上面的代码仅在 jsonData 的内容实际上是有效的 JSON 时才将 validJson 设置为 true。目前,如果我将任何东西输入到代码中可见的 "myfile" 文件中,validJson 就会始终为真。 我该如何修复它,以便 validJson 只有在实际上是有效 JSON 时才为 true?

你能举个例子,说明哪些无效数据实际上被解析并报告为有效的吗? - Sulthan
@Sulthan 我刚刚用一个HTML文件替换了myfile,但是它仍然将validJson设置为true。 - jskidd3
通过仅使用常量字符串jsonString,使测试用例更简单。 - zaph
2
为什么要将NSData转换为NSString,然后再转回NSData? - Martin R
如果您直接复制您的代码,会出现一些关于解封包的编译错误。我猜您发布的代码并不是您正在测试的真正代码? - Sulthan
显示剩余2条评论
2个回答

10
isValidJSONObject:

返回一个布尔值,该布尔值指示给定的对象是否可以转换为 JSON 数据。

代码示例

    let jsonString = "{}"
    let jsonData = jsonString.data(using: String.Encoding.utf8)

    if JSONSerialization.isValidJSONObject(jsonData) {
        print("Valid Json")
    } else {
        print("InValid Json")
    }

API参考文档:


3
这个答案对我无效,请查看此答案 https://stackoverflow.com/questions/40635993/nsjsonserialization-isvalidjsonobject-returns-false-for-received-data-from-venue - andreskwan
2
是的,这个答案是错误的。isValidJSONObject实际上是相反的。返回一个布尔值,指示给定的对象是否可以转换为JSON数据。 - trapper
2
这段代码并不检查 JSON 字符串是否有效。 - radu122
2
这个答案是错误的,应该从被接受的答案中删除。如果您想检查Data对象是否为有效的JSON,则需要检查try? JSONSerialization.jsonObject(with: data, options: []) != nil是否为真。 - Justin Sato

3
我已经测试了以下内容:
let jsonString = ""

let jsonString = "<html></html>"

let jsonString = "{}"

使用代码:

let jsonData: NSData = jsonString.dataUsingEncoding(NSUTF8StringEncoding)!
var error: NSError? = nil

let validJson = (NSJSONSerialization.JSONObjectWithData(jsonData, options:nil, error: &error) != nil)

println("Valid JSON: \(validJson)")

前两个字符串输出false,第三个字符串按预期输出true

我认为你可能加载了一个与你期望的不同的文件。


感谢您澄清这一点。在生产代码中似乎有两个同名变量导致了问题。 - jskidd3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接