【问题标题】:Compare JSON response to a String将 JSON 响应与字符串进行比较
【发布时间】:2013-03-13 16:35:31
【问题描述】:

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

我的预期字符串带有引号这一事实使我很难将我的响应数据与该字符串进行比较。

我确信有办法做我想做的事。

【问题讨论】:

  • 玩火。服务器可以发回{ "status":"ok"}。视为 JSON,而不是字符串。
  • 如果事情不顺利会发生什么?
  • 没错,这是一个愚蠢的想法。其实我知道这不是我应该做的,我有时只是懒惰:)

标签: ios objective-c json


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我想我最好解析一下
  • @ChalamphongPandey 绝对。永远不要假设其他人的代码会完全满足您的期望。
【解决方案2】:

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

How to escape double quotes in string?

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

【讨论】:

  • 感谢您的快速答复:)
【解决方案3】:

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

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

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

【讨论】:

  • 是的,我们的服务器将返回完全相同的字符串,我被告知这在很长一段时间内都不会改变,但现在我考虑一下,我可能应该解析它。 “预防胜于治疗”不过感谢您的回答,这件事一直困扰着我一段时间,改天可能会有所帮助
【解决方案4】:

正如@DrC 在他/她的answer 中提到的,比较两个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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多