繁体   English   中英

将 JSON 响应与字符串进行比较

[英]Compare JSON response to a String

所以我的 iOS 应用程序将数据 (json) 发送到服务器,如果一切顺利,服务器会发回一个 json 响应{"status":"ok"} 我在想我不需要真正解析这个响应,因为它只是一个确认,所以我可以将我得到的响应与静态NSString进行比较,后者将是"status":"ok"

事实上,我想要的 String 有一个引号,这让我很难将我的响应数据与这个 String 进行比较。

我确信有一种方法可以做我想做的事情。

可能不是你想要的答案。 在某些时候,您会想要执行以下操作之一:

  • 在响应中添加一个新字段以支持新的应用程序版本(可能是 pid 或 nonce)
  • 更改服务器端代码以使用新的 JSON 编码器(可能是具有不同空白行为的编码器)
  • 状态不正常时添加错误消息

发生这种情况时,您应用程序的所有旧版本都会阻止您执行此操作。 取而代之的是,今天正确地进行解析,以在未来为自己买单。 NSJSONSerialization 易于使用,并且可以快速解析处理上述每种情况的结果。

我想您是在问如何在字符串中包含双引号?

如何在字符串中转义双引号?

在类 C 语言中转义字符的标准方法是使用反斜杠,因此您需要将结果与字符串"{\\"status\\":\\"ok\\"}"

您是否只是在问如何在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM