簡體   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