Я считаю, что самый простой способ представить ваши кортежи - это объявить data class
, например:
data class TupleData(val id: Int,
val firstString: String,
val secondString: String,
val otherNumber: Int,
val anotherNumber: Int)
, а затем объявить вашу структуру данных как HashMap<String, TupleData>
. Обратите внимание, что вам нужно подумать об обнуляемости типов (String
или String?
) и о том, имеют ли они неизменные ссылки (val
или var
), поскольку вы не указали их в своем вопросе.
Кроме того, я думаю, что для облегчения вашей жизни вы можете использовать Moshi с настраиваемым адаптером для анализа вашей строки, как если бы это был JSON объект непосредственно в ваших структурах данных. (но имейте в виду этот другой ответ ).
Вы не можете объявить Array
как Array<Integer, String, String, Integer>
, поскольку он принимает только один универсальный c параметр с именем T
в kotlin документация . Если вы хотите указать кортеж, вы должны использовать Pair или Triple , и если в кортеже больше данных, то объявите data class
РЕДАКТИРОВАТЬ: Попытавшись создать рабочий пример с вашими данными, я заметил, что они неправильно отформатированы для анализа JSON, поэтому вам, вероятно, придется анализировать их вручную.
Если вы все еще хотите разобраться, как сериализовать в JSON (возможно, используя pickle из Python), вот как я реализовал адаптер:
class TupleDataAdapter {
@ToJson
fun toJson(tupleData: TupleData) : String {
val (id, first, second, other, another) = tupleData;
return "($id, $first, $second, $other, $another)"
}
@FromJson
fun fromJson(tuple: String) : TupleData {
if (tuple[0] != '(' || tuple.last() != ')') {
throw JsonDataException("Wrong format for tuple data: missing '(' or ')'")
}
val trimmed = tuple.trimStart('(').trimEnd(')')
val fields = trimmed.split(',')
if (fields.size != 5) {
throw JsonDataException("Wrong format for tuple data: wrong number of fields in tuple")
}
return TupleData(fields[0].toInt(), fields[1], fields[2], fields[3].toInt(), fields[4].toInt())
}
}
fun main(args: Array<String>) {
val dict = File("./dict.txt").readText()
println(dict)
val moshi = Moshi.Builder()
.add(TupleDataAdapter())
.build()
val type = Types.newParameterizedType(Map::class.java, String::class.java, TupleData::class.java)
val mapAdapter : JsonAdapter<Map<String, TupleData>> = moshi.adapter(type)
val decoded : Map<String, TupleData>? = mapAdapter.fromJson(dict)
println(decoded)
}
Эта реализация работала правильно, когда я изменил текст как таковой:
{"key" : "(1,firstString,secondString,2,0)","secondKey" : "(0,firstString,secondString,4,1)"}
Обратите внимание на разницу в кавычках.