2

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

我想要的字符串有一个引号这一事实使我很难将我的响应数据与这个字符串进行比较。

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

4

4 回答 4

4

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

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

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

于 2013-03-13T16:42:36.183 回答
1

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

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

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

于 2013-03-13T16:39:59.837 回答
0

您只是在问如何在 Objective-C 字符串中包含文字引号?

if ([returnedText isEqualToString:@"{\"status\":\"ok\"}"]) {
    // success!
} else {
    // failure :-(
}

当然,你应该非常确定你只会得到这个确切的字符串......特别是,你能确保你返回的 JSON 不会包含任何你不期望的空格吗?

于 2013-03-13T16:41:19.633 回答
0

正如@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)
    }
}
于 2020-06-25T17:26:54.967 回答