Как в 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.

→ Ссылка