预期解码 Dictionary<String, Any> 但发现了 string/data
Expected to decode Dictionary<String, Any> but found a string/data instead
我正在使用 docodable 协议,但我遇到了这个错误:
typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [MakeApp_v2.Params.(CodingKeys in _244BBB2F32A8C5CF3DB84B0C6A94B232).config, Swift._DictionaryCodingKey(stringValue: "table", intValue: nil)], debugDescription: "Expected to decode Dictionary<String, Any> but found a string/data instead.", underlyingError: nil))
这是我遇到错误的JSON
{
"callBackID" : "add1867f-6005-189c-bbb4-ff53202b0697",
"config" : {
"description" : "Welcome Page",
"show-bottom-bar" : "",
"css-page-align" : "",
"footer" : { "show" : "", "object" : "bottom-bar" },
"pageStyle" : "full-page",
"sourceType" : "list",
"title" : "Welcome Page",
"header" : { "show" : true, "hide" : false, "object" : "top-bar" },
"columns" : {},
"objects" : {},
"showtabs" : true,
"slides" : [{"title" : "first section","map" : ["open"]}],
"table" : "",
"show-top-bar" : true,
"style_max-width" : "",
"slideType" : "slide"
},
"method" : 106,
"parName" : "A1519614709427",
"formid" : "1"
}
我的结构
struct Params: Decodable {
let callBackID: String, method: Int, parName: String, pageID: String?, table: String?, fields: [String: Properties]?, imageid: String?, imagetable: String?, config: [String: Config]?, appTemplate: String?, appName: String?, values: Properties?, columns: [String: Properties]?, filter: [String: Properties]?
private enum CodingKeys: String, CodingKey {
case callBackID = "callBackID", method = "method", parName = "parName", pageID = "pageID", table = "table", fields = "fields", imageid = "imageid", imagetable = "imagetable", config = "config", appTemplate = "appTemplate", appName = "appName", values = "values", columns = "columns", filter = "filter"
}
}
struct Properties: Decodable {
let source: String?, type: String?, rec_id: String?, name: String?, value: String?
}
struct Config: Decodable {
let table: String?
private enum CodingKeys: String, CodingKey {
case table = "table"
}
}
正在获取 JSON 数据
var param: Params?
do {
let jsonData = try JSONSerialization.data(withJSONObject: message.body, options: .prettyPrinted)
print(String(data: jsonData, encoding: .utf8)!)
param = try JSONDecoder().decode(Params.self, from: jsonData)
print(param!)
} catch {
print(error)
}
methods(param: param!)
print(methods)
}
func methods(param: Params) -> String { return "some string" }
我有 3 组 JSON 数据结构,前两组在这种结构下工作正常,但上面的 JSON 数据使程序停止。我不确定要更新我的代码什么。希望你能帮我解决这个问题,TIA!
好吧,为了更清楚起见,我只是将我的评论转换为答案。
问题是您的 config: [String: Config]?
在 Params
结构中。从 JSON 可以明显看出,您的键是 config
,值是 Config
类型对象而不是 Dictionary
类型。所以将配置 属性 更改为 config: Config?
.
另请注意:当您的struct
中的属性与JSON键相同时,您可以省略CodingKeys
枚举(就像你对 Properties
结构所做的那样)
额外说明:我在您的结构定义中看到很多 optional
。请仅考虑真正需要 optional
类型的情况。不要只是不必要地使用它们。
struct Params: Decodable {
let callBackID: String
let method: Int
let parName: String
let pageID: String?
let table: String?
let fields: [String: Properties]?
let imageid: String?
let imagetable: String?
let config: Config?
let appTemplate: String?
let appName: String?
let values: Properties?
let columns: [String: Properties]?
let filter: [String: Properties]?
}
For further notes, what I suspect more is, you will also get in troubles with your [String: Properties]?
types later. It's more like this config
property I suspect.
struct Params: Decodable {
let callBackID: String, method: Int, parName: String, pageID: String?, table: String?, fields: [String: Properties]?, imageid: String?, imagetable: String?, config: Config?, appTemplate: String?, appName: String?, values: Properties?, columns: [String: Properties]?, filter: [String: Properties]?
private enum CodingKeys: String, CodingKey {
case callBackID = "callBackID", method = "method", parName = "parName", pageID = "pageID", table = "table", fields = "fields", imageid = "imageid", imagetable = "imagetable", config = "config", appTemplate = "appTemplate", appName = "appName", values = "values", columns = "columns", filter = "filter"
}
}
struct Properties: Decodable {
let source: String?, type: String?, rec_id: String?, name: String?, value: String?
}
struct Config: Decodable {
let table: String?
private enum CodingKeys: String, CodingKey {
case table = "table"
}
}
对不起我的错!我的密钥配置的对象类型错误。改为 config = [String: Config?] 改为 config = Config?感谢@nayem
我正在使用 docodable 协议,但我遇到了这个错误:
typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [MakeApp_v2.Params.(CodingKeys in _244BBB2F32A8C5CF3DB84B0C6A94B232).config, Swift._DictionaryCodingKey(stringValue: "table", intValue: nil)], debugDescription: "Expected to decode Dictionary<String, Any> but found a string/data instead.", underlyingError: nil))
这是我遇到错误的JSON
{
"callBackID" : "add1867f-6005-189c-bbb4-ff53202b0697",
"config" : {
"description" : "Welcome Page",
"show-bottom-bar" : "",
"css-page-align" : "",
"footer" : { "show" : "", "object" : "bottom-bar" },
"pageStyle" : "full-page",
"sourceType" : "list",
"title" : "Welcome Page",
"header" : { "show" : true, "hide" : false, "object" : "top-bar" },
"columns" : {},
"objects" : {},
"showtabs" : true,
"slides" : [{"title" : "first section","map" : ["open"]}],
"table" : "",
"show-top-bar" : true,
"style_max-width" : "",
"slideType" : "slide"
},
"method" : 106,
"parName" : "A1519614709427",
"formid" : "1"
}
我的结构
struct Params: Decodable {
let callBackID: String, method: Int, parName: String, pageID: String?, table: String?, fields: [String: Properties]?, imageid: String?, imagetable: String?, config: [String: Config]?, appTemplate: String?, appName: String?, values: Properties?, columns: [String: Properties]?, filter: [String: Properties]?
private enum CodingKeys: String, CodingKey {
case callBackID = "callBackID", method = "method", parName = "parName", pageID = "pageID", table = "table", fields = "fields", imageid = "imageid", imagetable = "imagetable", config = "config", appTemplate = "appTemplate", appName = "appName", values = "values", columns = "columns", filter = "filter"
}
}
struct Properties: Decodable {
let source: String?, type: String?, rec_id: String?, name: String?, value: String?
}
struct Config: Decodable {
let table: String?
private enum CodingKeys: String, CodingKey {
case table = "table"
}
}
正在获取 JSON 数据
var param: Params?
do {
let jsonData = try JSONSerialization.data(withJSONObject: message.body, options: .prettyPrinted)
print(String(data: jsonData, encoding: .utf8)!)
param = try JSONDecoder().decode(Params.self, from: jsonData)
print(param!)
} catch {
print(error)
}
methods(param: param!)
print(methods)
}
func methods(param: Params) -> String { return "some string" }
我有 3 组 JSON 数据结构,前两组在这种结构下工作正常,但上面的 JSON 数据使程序停止。我不确定要更新我的代码什么。希望你能帮我解决这个问题,TIA!
好吧,为了更清楚起见,我只是将我的评论转换为答案。
问题是您的 config: [String: Config]?
在 Params
结构中。从 JSON 可以明显看出,您的键是 config
,值是 Config
类型对象而不是 Dictionary
类型。所以将配置 属性 更改为 config: Config?
.
另请注意:当您的struct
中的属性与JSON键相同时,您可以省略CodingKeys
枚举(就像你对 Properties
结构所做的那样)
额外说明:我在您的结构定义中看到很多 optional
。请仅考虑真正需要 optional
类型的情况。不要只是不必要地使用它们。
struct Params: Decodable {
let callBackID: String
let method: Int
let parName: String
let pageID: String?
let table: String?
let fields: [String: Properties]?
let imageid: String?
let imagetable: String?
let config: Config?
let appTemplate: String?
let appName: String?
let values: Properties?
let columns: [String: Properties]?
let filter: [String: Properties]?
}
For further notes, what I suspect more is, you will also get in troubles with your
[String: Properties]?
types later. It's more like thisconfig
property I suspect.
struct Params: Decodable {
let callBackID: String, method: Int, parName: String, pageID: String?, table: String?, fields: [String: Properties]?, imageid: String?, imagetable: String?, config: Config?, appTemplate: String?, appName: String?, values: Properties?, columns: [String: Properties]?, filter: [String: Properties]?
private enum CodingKeys: String, CodingKey {
case callBackID = "callBackID", method = "method", parName = "parName", pageID = "pageID", table = "table", fields = "fields", imageid = "imageid", imagetable = "imagetable", config = "config", appTemplate = "appTemplate", appName = "appName", values = "values", columns = "columns", filter = "filter"
}
}
struct Properties: Decodable {
let source: String?, type: String?, rec_id: String?, name: String?, value: String?
}
struct Config: Decodable {
let table: String?
private enum CodingKeys: String, CodingKey {
case table = "table"
}
}
对不起我的错!我的密钥配置的对象类型错误。改为 config = [String: Config?] 改为 config = Config?感谢@nayem