Разбор JSON-тела в Java
Тело ответа API - это всегда текст. Перед разбором его
удобно сохранить в переменную, даже если строка уже
задана в программе. Jackson читает ключи по именам
компонентов record, в том числе когда
значение само является объектом.
Для блока user объявляют отдельный тип, а
корневой record ссылается на него компонентом:
public record Person(String name, String surn) {}
public record ProfileDoc(Person user, String city) {}
Готовый фрагмент JSON можно разобрать сразу в
ProfileDoc и обратиться к вложенным полям
через точку:
import com.fasterxml.jackson.databind.ObjectMapper;
public record Person(String name, String surn) {}
public record ProfileDoc(Person user, String city) {}
public class Main {
public static void main(String[] args) throws Exception {
String raw = """
{
"user": {
"name": "john",
"surn": "smit"
},
"city": "London"
}
""";
ObjectMapper mapper = new ObjectMapper();
ProfileDoc doc = mapper.readValue(raw, ProfileDoc.class);
System.out.println(doc.user().name());
System.out.println(doc.city());
}
}
Если в корне лежит массив строк, тип задают через
TypeReference. Порядок элементов в списке
совпадает с порядком в JSON:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
String raw = "[\"alpha\",\"beta\",\"gamma\"]";
ObjectMapper mapper = new ObjectMapper();
List<String> tags = mapper.readValue(
raw,
new TypeReference<List<String>>() {},
);
System.out.println(String.join(",", tags));
}
}
Дана строка:
String raw = """
{
"user": {
"name": "john",
"surn": "smit"
},
"city": "London"
}
""";
Опишите record для user и корня.
Выведите имя и город на отдельных строках.