Проблема с дисериализацией объектов 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
, внутри которых на любом уровне вложенности есть объекты с таким же именем (и того же типа), то сборка такого объекта происходит корректно.
Люди добрые, подскажите, пожалуйста, как можно решить мою проблему?