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

时间:2013-03-13 16:35:32

标签: ios objective-c json

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

我的预期字符串有引号这一事实使我将我的响应数据与此字符串进行比较非常棘手。

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

4 个答案:

答案 0 :(得分:4)

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

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

当发生这种情况时,您应用的所有旧版本都会阻止您这样做。相反,今天要正确解析,以便在将来为自己买单。 NSJSONSerialization易于使用,可以快速解析处理上述每种情况的结果。

答案 1 :(得分:0)

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

How to escape double quotes in string?

以类似C语言转义字符的标准方法是使用反斜杠,因此您需要将结果与字符串“\”status \“:”\“ok \”“

进行比较

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

@DrC在他的answer中提到,比较两个JSON字符串时正确的做法是使用JSONSerialization类将JSON字符串解析为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)
    }
}