在另一个 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\"}"}"#
我有一些 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\"}"}"#