Java Json десериализация только нужных данных Как содержимое которое находится в «Campaigns» положить как объект в массив? Желательно при помощи библиотеки jackson
Json строка
{
"result": {
"Campaigns": [
{
"Id": 37272735,
"StartDate": "2018-09-14",
"Name": "Optliner v1"
},
{
"Name": "MyTestCompany",
"StartDate": "2019-06-09",
"Id": 43840339
}
]
}
}
Объект
public class MyClass {
int id;
String startDate;
String name;
// geters and setters
}
Мой код который не работает
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) throws IOException {
String json = "{\n" +
" \"result\": {\n" +
" \"Campaigns\": [\n" +
" {\n" +
" \"id\": 37272735,\n" +
" \"startDate\": \"2018-09-14\",\n" +
" \"name\": \"Optliner v1\"\n" +
" },\n" +
" {\n" +
" \"name\": \"MyTestCompany\",\n" +
" \"startDate\": \"2019-06-09\",\n" +
" \"id\": 43840339\n" +
" }\n" +
" ]\n" +
" }\n" +
"}";
ObjectMapper mapper = new ObjectMapper();
List<MyClass> myObjects = Arrays.asList(mapper.readValue(json, MyClass[].class));
for (MyClass el : myObjects) {
System.out.println(el.getName() + " " + el.getStartDate() + " " + el.getId());
}
}
}
Для того чтобы заработало нужно использовать объект с идентичной структурой.
Попробуйте
class Wrapper {
Result result;
}
class Result {
List<MyClass> Campaigns;
}
mapper.readValue(json, Wrapper.class).getResult().getCompains().stream().foreach(el -> {
System.out.println(el.getName() + " " + el.getStartDate() + " " + el.getId());
});
можно подключить
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
создать объект конфигурацию для сериализации
private static Configuration gsonConf = Configuration
.builder()
.jsonProvider(new GsonJsonProvider())
.mappingProvider(new GsonMappingProvider())
.build();
передать json в виде строки, указать к какому классу сериализовать, путь до нужного нам json структуры
private static <T> T getObject(String json, Class<T> objectClass, String jsonPath) {
return JsonPath.using(gsonConf).parse(json).read(jsonPath, objectClass);
}
это пример как получить списком
private static <T> List<T> getObjectsList(String json, Class<T[]> objectClass, String jsonPath) {
return Arrays.asList(getObject(json, objectClass, jsonPath));
}
и вызывать в Вашем случае как
List<MyClass> objectsList = getObjectsList(json, MyClass[].class, "$.result.Campaigns");
Разобрался, решение задачи такое
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json).get("result").get("Campaigns");
List<MyClass> myObjects = Arrays.asList(mapper.readValue(node.toString(), MyClass[].class));
for (MyClass el : myObjects) {
System.out.println(el.getName() + " " + el.getStartDate() + " " + el.getId());
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хочу написать простую программу для вывода погоды и тд, но возникли трудности с выводом времени(а именно с разницей времени в часовых поясах)
Подскажите пожалуйста, ка правильно написать следующий код
Вот рабочий пример, но вдруг вздумалось написать покороче и заодно "пощупать" шаблонные строки