在另一个 JSON 中解析 JSON 字符串

Parse JSON string inside another JSON

我有一些 JSON 在 中以字符串形式 包含另一个 JSON 对象(注意 "jsonString" 值周围的引号):

{
  "jsonString":"{\"someKey\": \"Some value\"}"
}

我知道如果 "jsonString" 的值没有引号,我会这样做:

import Foundation

struct Something: Decodable {
  struct SomethingElse: Decodable {
    let someKey: String
  }
  let jsonString: SomethingElse
}

let jsonData = """
               {
                 "jsonString":"{\"someKey\": \"Some value\"}"
               }
               """.data(using: .utf8)!
let something = try! JSONDecoder().decode(Something.self, from: jsonData)

但这对我的情况不起作用。即使我将 "jsonString" 视为 String 并执行如下操作,它也不起作用:

init(from decoder: Decoder) throws {
  let container = try decoder.container(keyedBy: SomethingKey.self)

  let jsonStringString = try container.decode(String.self, forKey: .jsonString)
  if let jsonStringData = jsonStringString.data(using: .utf8) {
    self.jsonString = try JSONDecoder().decode(SomethingElse.self, from: jsonStringData)
  } else {
    self.jsonString = SomethingElse(someKey: "")
  }
}
private enum SomethingKey: String, CodingKey {
  case jsonString
}

我遇到的错误是:

Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Badly formed object around line 2, column 18." UserInfo={NSDebugDescription=Badly formed object around line 2, column 18., NSJSONSerializationErrorIndex=20})))

但是,我尝试过的所有 JSON 验证器都说 JSON 是有效的并且符合 RFC 8259。

Swift 也不让我转义嵌套的“{”和“}”。


不幸的是,JSON 格式不在我的控制范围内,我无法更改它。

我还找到了 this 问题,看起来很相似,但没有任何效果。答案仅与常规嵌套 JSON 对象相关。或者我错过了什么。

感谢任何帮助!

错误是说整个 JSON 无效,而不仅仅是 jsonString 值。

虽然确实如此(您可以在在线验证器中测试它,例如 JSONLint):

{
    "jsonString": "{\"someKey\": \"Some value\"}"
}

在 Swift 中将其声明为字符串时,您需要确保反斜杠确实存在。

所以是:

let jsonString = """
{ "jsonString": "{\"someKey\": \"Some value\"}"}
"""

let jsonString = #"{"jsonString":"{\"someKey\": \"Some value\"}"}"#