Как в Jackson получить json массива объектов с разным количеством полей?
Нужно получить такой json. Как это сделать?
{
"list" : [
{
"f1" : "x",
"f2" : 99
},
{
"f1" : "y"
}
]
}
Может быть есть какой то специальный объект для этого?
Например следующий способ дает не тот результат:
data class Class1(
val list: List<String>,
) {
}
data class A(
val f1: String,
val f2: Int,
) {
}
data class B(
val f1: String,
) {
}
val mapper = ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
val a = mapper.writeValueAsString(A("x", 99))
val b = mapper.writeValueAsString(B("y"))
val class1 = Class1(listOf(a, b))
println(mapper.writeValueAsString(class1))
Результат
{
"list" : [
"{\r\n \"f1\" : \"x\",\r\n \"f2\" : 99\r\n}",
"{\r\n \"f1\" : \"y\"\r\n}"
]
}
Ответы (1 шт):
writeValueAsString
Это заставляет писать в list
строки, причём уже сериализованные. Вероятно, то, что Вам нужно — гетерогенный список. В частности, можно подсмотреть такой в org.json, но насколько я помню, Jackson вполне скушает и List<Object>
(в принципе, с List<Any?>
тоже должно работать).
Собственно,
data class Class1(val list: List<Any>)
data class A(val f1: String, f2: Int)
data class B(val f1: String)
…
println(mapper.writeValueAsString(Class1(listOf<Any>(A("x", 99), B("y")))))
Однако всё же стоит посмотреть в сторону Map<String, Any?>
вместо Class1
для совершенно произвольных данных; либо поискать какие-нибудь закономерности в данных, дабы нарисовать адекватное представление в kotlin.