如何解码扩展名为decodable的JSON嵌套字典数组?

如何解码扩展名为decodable的JSON嵌套字典数组?,json,swift,codable,decodable,Json,Swift,Codable,Decodable,我有这样的JSON: { "states" : [ "C", "A", "B", "Sink", ], "symbols" : [ "c", "a", "b" ], "transitions" : [ {

我有这样的JSON:

{
  "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]
不是一个好主意,因为您将失去与
的同步。不清楚您最终想要什么。为什么要展平过渡?为什么注释具有struct
Transition:Codable{let with:String;let to:String;let from:String}
和在
FiniteAutomata
中:
let transitions:[Transition]
let with:[String]
不是一个好主意,因为您将失去与
的同步,从
。谢谢,我不知道init是自动执行的。我不知道init是自动执行的