无法解码 JSON,因为模型是可识别的
Fail to decode JSON because the model is Identifiable
我有一个JSON这样的
[
{
"name": "car",
"color": "red"
},
{
"name": "bike",
"color": "blue"
},
... etc
]
并且我在解码过程中使用了这个模型
struct Element:Codable {
var name:String?
var color:String?
}
稍后在代码中我有一个 ScrollView
这样的
ScrollView(.vertical, showsIndicators: false) {
LazyVGrid(columns: gridItemLayout, alignment: .center, spacing: 10, content: {
ForEach(allElements) { element in
allElements
是 Element
.
的数组
因为我在那里使用 allElements
,所以我必须使 Element
可识别...
struct Element:Codable, Identifiable {
var id = UUID()
var name:String?
var color:String?
}
现在无法解码 JSON,因为 JSON 没有 id
。
我已经尝试添加
"id" : "",
到 JSON 上的所有元素都没有成功。
有什么想法吗?
你只需要告诉编译器id
不是JSON的一部分。您可以通过在 Codable
类型上声明 CodingKey
兼容 enum
来做到这一点。
合成的 Codable
方法将仅使用符合 CodingKey
的 enum
中的键用于 decoding/encoding 您的类型。因此,如果您从 enum
中省略 id
并且仅指定 name
和 color
,Codable
将不会尝试寻找 id
键入 JSON.
struct Element: Codable, Identifiable {
let id = UUID()
var name:String?
var color:String?
private enum CodingKeys: String, CodingKey {
case color
case name
}
}
我有一个JSON这样的
[
{
"name": "car",
"color": "red"
},
{
"name": "bike",
"color": "blue"
},
... etc
]
并且我在解码过程中使用了这个模型
struct Element:Codable {
var name:String?
var color:String?
}
稍后在代码中我有一个 ScrollView
这样的
ScrollView(.vertical, showsIndicators: false) {
LazyVGrid(columns: gridItemLayout, alignment: .center, spacing: 10, content: {
ForEach(allElements) { element in
allElements
是 Element
.
因为我在那里使用 allElements
,所以我必须使 Element
可识别...
struct Element:Codable, Identifiable {
var id = UUID()
var name:String?
var color:String?
}
现在无法解码 JSON,因为 JSON 没有 id
。
我已经尝试添加
"id" : "",
到 JSON 上的所有元素都没有成功。
有什么想法吗?
你只需要告诉编译器id
不是JSON的一部分。您可以通过在 Codable
类型上声明 CodingKey
兼容 enum
来做到这一点。
合成的 Codable
方法将仅使用符合 CodingKey
的 enum
中的键用于 decoding/encoding 您的类型。因此,如果您从 enum
中省略 id
并且仅指定 name
和 color
,Codable
将不会尝试寻找 id
键入 JSON.
struct Element: Codable, Identifiable {
let id = UUID()
var name:String?
var color:String?
private enum CodingKeys: String, CodingKey {
case color
case name
}
}