如何解码扩展名为decodable的JSON嵌套字典数组?
我有这样的JSON:如何解码扩展名为decodable的JSON嵌套字典数组?,json,swift,codable,decodable,Json,Swift,Codable,Decodable,我有这样的JSON: { "states" : [ "C", "A", "B", "Sink", ], "symbols" : [ "c", "a", "b" ], "transitions" : [ {
{
"states" : [
"C",
"A",
"B",
"Sink",
],
"symbols" : [
"c",
"a",
"b"
],
"transitions" : [
{
"with" : "c",
"to" : "B",
"from" : "C"
},
{
"with" : "c",
"to" : "Sink",
"from" : "C"
},
{
"with" : "b",
"to" : "B",
"from" : "B"
},
{
"with" : "b",
"to" : "Sink",
"from" : "B"
},
{
"with" : "c",
"to" : "C",
"from" : "A"
},
{
"with" : "c",
"to" : "Sink",
"from" : "A"
},
{
"with" : "a",
"to" : "A",
"from" : "A"
},
{
"with" : "a",
"to" : "Sink",
"from" : "A"
}
],
"initialState" : "A",
"finalStates" : [
"B"
]
}
我无法解码转换部分JSON(我需要像苹果那样解码)。
到目前为止,我得到的是这个(注释部分是前导错误类型不匹配(Swift.Dictionary,Swift.DecodingError.Context(codingPath:[],debugDescription:“应该解码字典,但找到了一个数组。”,underlineerror:nil)))
key
transition
的值是一个字典数组,它变成了一个结构数组
struct Transition : Decodable {
let with, to, from : String
}
然后解码
let transitions : [Transition]
所有
CodingKeys
和自定义init
方法都是不需要的键transition
的值是一个字典数组,它成为一个结构数组
struct Transition : Decodable {
let with, to, from : String
}
然后解码
let transitions : [Transition]
不需要所有编码键
和自定义init
方法您需要
struct Transition: Decodable {
let with,to,from:String
}
然后
也删除
public init(from decoder: Decoder)throws{
let decoderContainer = try decoder.container(keyedBy: CodingKeys.self)
states = try decoderContainer.decode([String].self, forKey: .states)
symbols = try decoderContainer.decode([String].self, forKey: .symbols)
initialState = try decoderContainer.decode(String.self, forKey: .initialState)
finalStates = try decoderContainer.decode([String].self, forKey: .finalStates)
/*
let nestedContainer = try decoderContainer.nestedContainer(keyedBy: transitionInfoKeys.self, forKey: .transitions)
with = try nestedContainer.decode([String].self, forKey: .with)
to = try nestedContainer.decode([String].self, forKey: .to)
from = try nestedContainer.decode([String].self, forKey: .from)
*/
}
由于这将自动发生,因此无需手动写入
struct Transition: Decodable {
let with,to,from:String
}
然后
也删除
public init(from decoder: Decoder)throws{
let decoderContainer = try decoder.container(keyedBy: CodingKeys.self)
states = try decoderContainer.decode([String].self, forKey: .states)
symbols = try decoderContainer.decode([String].self, forKey: .symbols)
initialState = try decoderContainer.decode(String.self, forKey: .initialState)
finalStates = try decoderContainer.decode([String].self, forKey: .finalStates)
/*
let nestedContainer = try decoderContainer.nestedContainer(keyedBy: transitionInfoKeys.self, forKey: .transitions)
with = try nestedContainer.decode([String].self, forKey: .with)
to = try nestedContainer.decode([String].self, forKey: .to)
from = try nestedContainer.decode([String].self, forKey: .from)
*/
}
由于这将自动发生,因此无需手动写入最终不清楚您想要什么。为什么要展平过渡?为什么注释具有struct
Transition:Codable{let with:String;let to:String;let from:String}
和在FiniteAutomata
中:let transitions:[Transition]
let with:[String]
不是一个好主意,因为您将失去与从
和到
的同步。不清楚您最终想要什么。为什么要展平过渡?为什么注释具有structTransition:Codable{let with:String;let to:String;let from:String}
和在FiniteAutomata
中:let transitions:[Transition]
let with:[String]
不是一个好主意,因为您将失去与的同步,从
和到
。谢谢,我不知道init是自动执行的。我不知道init是自动执行的