Java Json десериализация только нужных данных

116
03 февраля 2021, 06:00

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());
        }
    }
}
Answer 1

Для того чтобы заработало нужно использовать объект с идентичной структурой.

Попробуйте

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());
        });
Answer 2

можно подключить

    <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");
Answer 3

Разобрался, решение задачи такое

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());
        }
READ ALSO
Юникс время в js

Юникс время в js

Хочу написать простую программу для вывода погоды и тд, но возникли трудности с выводом времени(а именно с разницей времени в часовых поясах)

120
Kак правильно выбрать дочерний элемент this?

Kак правильно выбрать дочерний элемент this?

Подскажите пожалуйста, ка правильно написать следующий код

121
arr.reduce и стрелочная функция

arr.reduce и стрелочная функция

Что делает ",0" после колбэк функции и зачем он нужен?

129
Как написать шаблонную строку, если есть теги и тернарное выражение?

Как написать шаблонную строку, если есть теги и тернарное выражение?

Вот рабочий пример, но вдруг вздумалось написать покороче и заодно "пощупать" шаблонные строки

135