Проблема с дисериализацией объектов Kotlin из JSON строки с вложенностью

Пытаюсь из JSON строки дисерилизовать объект в Kotlin. Но, к сожалению, возникла проблема со сборкой объектов. На рисунке ниже представлена структура JSON файла.
введите сюда описание изображения

Проблема проявляется при попытке собрать объект list, который внутри себя хранит объект array, array в свою очередь объект elem, а elem опять объект list (не тот же самый, что и в начале, просто другой объект того же типа и с тем же именем).

Для дисериализации использую конструкцию Json{}.decodeFromString<ClassName>(json):

fun main() {
  val format = Json {
    ignoreUnknownKeys = true
    isLenient = true
  }
  var text = ""
  val path = Paths.get("C:\\Users\\User\\IdeaProjects\\testing\\src\\main\\kotlin\\test.json")
  Files.lines(path, Charsets.UTF_8).forEach {
    text = it
  }
  val equipment = format.decodeFromString < Meta2Equipment > (text)
  println(equipment.registers.list.dateTimes[1].comment)
}

При попытке дисериализовать объект такого формата возникает следующая ошибка:

Exception in thread "main" java.lang.StackOverflowError
    at abc.core.subjectarea.equipment.Meta2JsonList.<init>(Meta2JsonList.kt:14)
    at abc.core.subjectarea.equipment.Meta2Face.<init>(Meta2Face.kt:18)
    at abc.core.subjectarea.equipment.Meta2Array.<init>(Meta2Array.kt:12)
    at abc.core.subjectarea.equipment.Meta2JsonList.<init>(Meta2JsonList.kt:26)
    at abc.core.subjectarea.equipment.Meta2Face.<init>(Meta2Face.kt:18)
    at abc.core.subjectarea.equipment.Meta2Array.<init>(Meta2Array.kt:12)
    at abc.core.subjectarea.equipment.Meta2JsonList.<init>(Meta2JsonList.kt:26)
    at abc.core.subjectarea.equipment.Meta2Face.<init>(Meta2Face.kt:18)
    at abc.core.subjectarea.equipment.Meta2Array.<init>(Meta2Array.kt:12)
    at abc.core.subjectarea.equipment.Meta2JsonList.<init>(Meta2JsonList.kt:26)
    at abc.core.subjectarea.equipment.Meta2Face.<init>(Meta2Face.kt:18)

Ниже предоставляю структуру классов дисериализируемых объектов. Из JSON собирается объект типа Meta2Equipment. Объект list типа Meta2JsonList. Объект elem типа Meta2Face. Объект array типа Meta2Array.

@Serializable
class Meta2Equipment{
    var oid:Long=0
    var valid:Boolean=false
    var versionRegNum:Int=0
    var versionRegValue:Int=0
    var versionRegName:String=""
    var outsideName:String=""
    var fileName:String=""
    var titleEng:String=""
    var protocolId:Int=0
    var readOnly:Boolean=false
    var registers:Meta2Collection=Meta2Collection()
    var xmlType:Int=0
    var shortName:String=""
    var title:String=""
    var comment:String=""
    constructor() {}
}

@Serializable
class Meta2Collection{
    var oid:Long=0
    var valid:Boolean=false
    var DOType:String=""
    var out61850Model:Boolean=false
    var in60870Model:Boolean=false
    var shortName:String=""
    var title:String=""
    var comment:String=""
    var list: Meta2JsonList = Meta2JsonList()
    constructor() {}
}

@Serializable
class Meta2JsonList {
    var comments: ArrayList<Meta2Comment> = ArrayList<Meta2Comment>()
    var comment: Meta2Comment = Meta2Comment()
    var settingRegisters: ArrayList<Meta2SettingRegister> = ArrayList<Meta2SettingRegister>()
    var settingRegister: Meta2SettingRegister = Meta2SettingRegister()
    var strings: ArrayList<Meta2String> = ArrayList<Meta2String>()
    var string: Meta2String = Meta2String()
    var stateRegisters: ArrayList<Meta2StateRegister> = ArrayList<Meta2StateRegister>()
    var stateRegister: Meta2StateRegister = Meta2StateRegister()
    var bitRegisters: ArrayList<Meta2BitRegister> = ArrayList<Meta2BitRegister>()
    var bitRegister: Meta2BitRegister = Meta2BitRegister()
    var dataRegisters: ArrayList<Meta2DataRegister> = ArrayList<Meta2DataRegister>()
    var dataRegister: Meta2DataRegister = Meta2DataRegister()
    var dateTimes: ArrayList<Meta2DateTime> = ArrayList<Meta2DateTime>()
    var dateTime: Meta2DateTime = Meta2DateTime()
    var arrays: ArrayList<Meta2Array> = ArrayList<Meta2Array>()
    var array: Meta2Array = Meta2Array()
    constructor() {}
}

@Serializable
class Meta2Array{
    var oid:Long=0
    var valid:Boolean=false
    var elem:Meta2Face=Meta2Face()
    var size:Int=0
    var step:Int=0
    var ownBase:Int=0
    var inline61860:Boolean=false
    var DOType:String=""
    var out61850Model:Boolean=false
    var in60870Model:Boolean=false
    var shortName:String=""
    var title:String=""
    var comment:String=""
    constructor() {}
}

@Serializable
class Meta2Face{
    var oid:Long=0
    var valid:Boolean=false
    var DOType:String=""
    var out61850Model:Boolean=false
    var in60870Model:Boolean=false
    var shortName:String=""
    var title:String=""
    var comment:String=""
    var list: Meta2JsonList = Meta2JsonList()
    constructor() {}
}

Если при десериализации объекта проигнорировать объекты list, внутри которых на любом уровне вложенности есть объекты с таким же именем (и того же типа), то сборка такого объекта происходит корректно.

Люди добрые, подскажите, пожалуйста, как можно решить мою проблему?


Ответы (0 шт):