Как получить массив данных из JSON-файла?

251
18 июля 2022, 20:50

Есть Json файл:

из массива псевдо компаний, надо получить и записать в Java в виде массива (ArrayList) весь файл, я перепробовал кучу вариантов, но как я понял у меня не получается именно из-за того, что в JSON'е лежит массив, если кто понимает как с помощью Jackson'a реализовать задачу, подскажите, пожалуйста.

Answer 1

Я разобрался, в первую очередь надо добавить, что есть файл и он НЕИЗМЕНЯЕМЫЙ, то есть вся программа нужна для того чтобы получить информацию из файла в массив, для дальнейших манипуляций с ним. Создал 2 класса: Company.java, Security.java, добавил в них переменные из json файла:

public class Company {
    String name;
    String address;
    String telNumber;
    String inn;
    String ogrn;
    Date date_Osnovania;
    ArrayList<Security> securities;
    public static void main(String[] args) throws Exception{
        File file = new File("Security.json");
        BufferedReader br = new BufferedReader(new FileReader(file));
        String st = br.readLine();
        String jsonFile = "";
        while (st != null) {
            jsonFile += st;
            st = br.readLine();
        }
        Gson gson = new Gson();
        Type secListType = new TypeToken<ArrayList<Security>>(){}.getType();
        ArrayList<Security> securities = gson.fromJson(jsonFile, secListType);
        System.out.println(securities.size());
        for(Security security : securities) {
            System.out.println(security);
        }
    }
    //Getters & Setters
    @Override
    public String toString(){
        return "Company [name=\"" + name + "\", address=\"" + address + "\", telNumber=\""
                + telNumber + "\", inn=\"" + inn + "\", ogrn=\"" + ogrn
                + "\", date_Osnovania=\"" + date_Osnovania + "\", securities=\"" + securities.toString() + "\"]";
    }

такой же метод main был реализован еще и в классе Main.java, таким образом был создан массив с объектами компаний с их параметрами в которых лежат массивы с ценными бумагами принадлежащие этим компаниям

public class Security {
    int id;
    String code;
    String name_bum;
    Date date_start;
    Date date_end;
    String currency;
   //Getters & Setters
    @Override
    public String toString(){
        return "Security [id=\"" + id + "\", code=\"" + code + "\", name_bum=\""
                + name_bum + "\", date_start=\"" + date_start + "\", date_end=\"" + date_end + "\", currency=\"" + currency + "\"]";
    }
Answer 2

Десериализация строки JSON

С помощью ObjectMapper можно десериализовать строку JSON в Map<String, Object> вместе со всеми вложенными массивами:

String str = "{\"obj\":{\"arr\":[{\"field\":\"M1\"},{\"field\":\"M2\"}]}}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> map = objectMapper.readValue(str, Map.class);
System.out.println(map); // {obj={arr=[{field=M1}, {field=M2}]}}

Либо если у нас JSON с массивом, тогда десериализуем его в List<Object>:

String arr = "[{\"field\":\"M1\"},{\"field\":\"M2\"}]";
ObjectMapper objectMapper = new ObjectMapper();
List<Object> list = objectMapper.readValue(arr, List.class);
System.out.println(list); // [{field=M1}, {field=M2}]

В общем случаем можно десериализовать в Object, если структура JSON заранее не известна:

Object object = objectMapper.readValue(json, Object.class);

Если структура известна и статична, тогда можно создать под неё POJO класс и десериализовать в него. Также десериализовать объект можно не только из строки, но и из других источников: Десериализация JSON из URL.

Answer 3

С помощью этого прекрасного ресурса (http://www.jsonschema2pojo.org/), генерируете POJO-класс для объекта вашей компании и для всех вложенных объектов. Допустим назовем его Company.

Потом парсите ваш документ в строку (если Json лежит в файле); Тут могу ошибаться, уже плохо помню как именно это делается.

InputStream is = new InputStream("path_to_yourfile");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String result = null;
while ((s = br.readLine()) != null) {
    sb.append(s);
    sb.append("\n");
}
result = sb.toString();

Потом добавляете зависимости какой-нибудь либы для сериализации. Мне нравится https://github.com/google/gson

Ну и потом все просто:

List<Company> companyList =
        new Gson.fromJson(result, new TypeToken<List<Company>>(){}.getType());

По итогу имеете список с обьектами ваших компаний.

READ ALSO
Как часто числа 0 и 1 встречаются в массиве

Как часто числа 0 и 1 встречаются в массиве

Создал массив из 10 чисел: 0 и 1, инициализировал каждый индекс массива как 0 или 1Написал цикл:

193
wait() и notify() в java

wait() и notify() в java

Такое делоЕсть список с пассажирами, которые ждут, пока каждого разбудит поток

258
При несуществующем RequestMapping возвращается 500 вместо 404

При несуществующем RequestMapping возвращается 500 вместо 404

При несуществующем RequesMapping (к примеру /fsdghfg/dsfgh/sdfghjk/dsfghjk) возвращается 500 вместо 404, ни один из Методов при этом не обрабатывается

155
Запуск jar на терминал

Запуск jar на терминал

Такая проблема: были созданы сервер и клиент и каждый по-отдельности помещён в jar пакетКак запустить сервер и клиент на терминале (Linux)? По отдельности...

224