[英]Compare JSON response to a String
所以我的 iOS 应用程序将数据 (json) 发送到服务器,如果一切顺利,服务器会发回一个 json 响应{"status":"ok"}
。 我在想我不需要真正解析这个响应,因为它只是一个确认,所以我可以将我得到的响应与静态NSString
进行比较,后者将是"status":"ok"
。
事实上,我想要的 String 有一个引号,这让我很难将我的响应数据与这个 String 进行比较。
我确信有一种方法可以做我想做的事情。
可能不是你想要的答案。 在某些时候,您会想要执行以下操作之一:
发生这种情况时,您应用程序的所有旧版本都会阻止您执行此操作。 取而代之的是,今天正确地进行解析,以在未来为自己买单。 NSJSONSerialization 易于使用,并且可以快速解析处理上述每种情况的结果。
您是否只是在问如何在 Objective-C 字符串中包含文字引号?
if ([returnedText isEqualToString:@"{\"status\":\"ok\"}"]) {
// success!
} else {
// failure :-(
}
当然,你应该非常确定你只会得到这个确切的字符串......特别是,你能确保你返回的 JSON 不会包含任何你不期望的空格吗?
正如@DrC 在他/她的回答中提到的,比较两个 JSON 字符串时正确的做法是将 JSON 字符串解析为具有JSONSerialization类的 Foundation 对象,然后比较生成的 Foundation 对象。 这种方法可以解决两个 JSON 字符串格式稍有不同或字段顺序不同的问题。 因此,例如,重要的是将"{\\"a\\":1,\\"b\\":2}"
和"{\\"b\\":2,\\"a\\":1}"
视为是相等的,因为它们在逻辑上是相等的。
这是我放在一起的一个 Swift 函数,它有助于进行这种比较:
class JSONAssert {
class func assertEquals(expected: String, actual: String) {
let expectedData = Data(expected.utf8)
let actualData = Data(actual.utf8)
let expectedObject: Any
let actualObject: Any
do {
expectedObject = try JSONSerialization.jsonObject(with: expectedData, options: [])
} catch {
XCTFail("Failed constructing a Foundation object from `expected` (i.e. \(expected)): \(error)")
return
}
do {
actualObject = try JSONSerialization.jsonObject(with: actualData, options: [])
} catch {
XCTFail("Failed constructing a Foundation object from `actual` (i.e. \(actual)): \(error)")
return
}
guard let expectedDictionary = expectedObject as? NSDictionary else {
XCTFail("Failed casting expected object (i.e. \(expectedObject)) to an NSDictionary")
return
}
guard let actualDictionary = actualObject as? NSDictionary else {
XCTFail("Failed casting actual object (i.e. \(actualObject)) to an NSDictionary")
return
}
XCTAssertEqual(expectedDictionary, actualDictionary)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.