Разбор JSON в загрузочном приложении Spring

У меня возникли проблемы с придумыванием способа разбора этого типа JSON. Мне нужно иметь возможность получать доступ как к данным, так и к сообщению отдельно после получения этого ответа внутри моего приложения.

{
    "data": [
        {
            "email": "[email protected]",
            "firstName": "Seras",
            "lastName": "Meras"
        },
        {
            "email": "[email protected]",
            "firstName": "Oras",
            "lastName": "Moras"
        },
        {
            "email": "[email protected]",
            "firstName": "hello",
            "lastName": "bye"
        },
        {
            "email": "[email protected]",
            "firstName": "Seras",
            "lastName": "Meras"
        }
    ],
    "message": "Success"
}

Может ли кто-нибудь предложить метод специально для загрузки Spring? Или распространенный способ, который используется в Spring boot для разбора этого типа JSON.

Спасибо.

РЕДАКТИРОВАТЬ

Мои главные вопросы будут заключаться в том, какой инструмент можно использовать для Spring Boot и как будет выглядеть мой класс POJO, если я буду использовать Jackson. Будет ли это как-то так?:

public class testPojo {
  Users[] users;
  String message;
}

Можете ли вы поделиться своим кодом до сих пор?

akortex 18.04.2019 15:46

Вы пробовали что-нибудь? Вы ознакомились с какой-либо документацией или образцами, предоставленными официальным сайтом Spring?

Abhijith Nagarajan 18.04.2019 15:47

Напишите "Как распарсить JSON java" в гугле, пожалуйста.

Airwavezx 18.04.2019 15:52

Пока у меня есть только собственный сервис, который общается с разными ответами, которые мне не нужно анализировать. Это ответ, который я получаю от другой службы REST, к которой я подключаюсь, и просто не могу придумать способ разобрать его на объект или объекты. Я только проверил здесь другие вопросы, но не нашел способа для этого типа JSON. Я просто даже не знаю, с чего начать. Кроме того, если возможно, мне не нужно было бы использовать какие-либо внешние файлы JAR. Я могу использовать зависимости maven.

Svajunas Kavaliauskas 18.04.2019 15:52

Если вы пытаетесь, чтобы кто-то другой сделал это за вас, вам следует научиться решать свои собственные проблемы. Это можно быстро решить с помощью простого поиска в Google.

Mike Tung 18.04.2019 15:53

@Abhijith Nagarajan Главный вопрос для меня: если я использую Джексона в этом случае, как будет выглядеть мой класс POJO? Будет ли это просто массив пользователей и строковое сообщение?

Svajunas Kavaliauskas 18.04.2019 16:01

@SvajunasKavaliauskas, как сказал Майк Тунг, выполните поиск в Google, прежде чем задавать вопрос, вот гид. Если вы столкнетесь с проблемами, вернитесь с вопросом о проблеме, которая у вас есть.

Dimitris 18.04.2019 16:15

@Dimitris Хорошо, спасибо, я вернусь, если у меня возникнут проблемы с определенным кодом.

Svajunas Kavaliauskas 18.04.2019 16:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
15 887
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Класс Pojo будет выглядеть так:

public class TestPojo{

    private Users[] data;
    private String message;

    public Users[] getData() {
        return data;
    }

    public void setData(Users[] data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
     }
}

class Users {
    private String email;
    private String firstName;
    private String lastName;
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

используйте @RequestBody в параметре метода вашего контроллера.

@RestController
class AbcController{

    PostMapping("/api")
    public String create(@RequestBody TestPojo test){
    // you can acess your json in test object
    return "done"
    } 
}

Спасибо. Теперь немного яснее.

Svajunas Kavaliauskas 18.04.2019 16:44

Дайте мне знать, если вы обнаружите какие-либо проблемы при реализации того же самого.

Bishal Jaiswal 18.04.2019 16:53

Необходимые установщики геттеров, поскольку Джексон при весенней загрузке по умолчанию преобразует json в объект pojo с помощью методов установщиков геттеров.

Bishal Jaiswal 18.04.2019 17:07

Привет еще раз. Просто хотел спросить, как будет выглядеть pojo, если вместо данных вместо [] будет { } и только один пользователь внутри этих данных. Я в замешательстве, так как с тех пор есть два открытия { подряд. Я могу отредактировать свой вопрос, чтобы сделать его более понятным, если вам нужно.

Svajunas Kavaliauskas 18.04.2019 17:12

{ "data": { "email": "[email protected]", "firstName": "Seras", "lastName": "Meras" }, "message": "hello"} для такого типа данных json pojo будет общедоступным в классе TestPojo вместо Users[] это будут только Users

Bishal Jaiswal 18.04.2019 17:24

измените Users[] на Users в TestPojo и его сеттере-получателе

Bishal Jaiswal 18.04.2019 17:28

Хорошо спасибо большое!

Svajunas Kavaliauskas 18.04.2019 17:28

Ой, извините, json все-таки не такой. Он начинает { "данные" { { "электронная почта"... вот с чем я борюсь. И я голосую, но голоса не учитываются из-за все еще низкой репутации. Я добавлю json через минуту.

Svajunas Kavaliauskas 18.04.2019 17:35

Можете ли вы предоставить полный json правильно?

Bishal Jaiswal 18.04.2019 17:36

{ "data":{ { "email": "[email protected]", "firstName": "Seras", "lastName": "Meras" }},"message":"Success"}

Svajunas Kavaliauskas 18.04.2019 17:40

Это недопустимый json. ключ данных не может содержать {{ он должен быть [{ (список пользовательских объектов)

Bishal Jaiswal 18.04.2019 17:42

Да, это был предыдущий вариант без лишних {}. Извините, что беспокою вас. Спасибо за помощь. Я постараюсь двигаться вперед.

Svajunas Kavaliauskas 18.04.2019 17:45
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializationFeature;
import lombok.Getter;
import lombok.Setter;
import org.junit.Test;
import org.springframework.context.annotation.Bean;

import java.io.IOException;
import java.util.List;

public class TestJUnit {

    @Test
    public void exec() {
       String json = "{" +
               "    \"data\": [" +
               "        {" +
               "            \"email\": \"[email protected]\"," +
               "            \"firstName\": \"Seras\"," +
               "            \"lastName\": \"Meras\"" +
               "        }," +
               "        {" +
               "            \"email\": \"[email protected]\"," +
               "            \"firstName\": \"Oras\"," +
               "            \"lastName\": \"Moras\"" +
               "        }," +
               "        {" +
               "            \"email\": \"[email protected]\"," +
               "            \"firstName\": \"hello\"," +
               "            \"lastName\": \"bye\"" +
               "        }," +
               "        {" +
               "            \"email\": \"[email protected]\"," +
               "            \"firstName\": \"Seras\"," +
               "            \"lastName\": \"Meras\"" +
               "        }" +
               "    ]," +
               "    \"message\": \"Success\"" +
               "}".replaceAll(" ", "");

        ObjectMapper mapper = new ObjectMapper();

        try {
            JsonParser parser = mapper.readValue(json, JsonParser.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Getter
    @Setter
    private static class JsonParser {
        private List<Data> data;
        private String message;
    }

    @Getter
    @Setter
    private static class Data{
        private String email;
        private String firstName;
        private String lastName;
    }

//    @Configuration
    private static class Configuration{
    @Bean
    public ObjectMapper objectMapper(){
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        mapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
        mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
        mapper.setVisibility(mapper.getSerializationConfig()
                .getDefaultVisibilityChecker().withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
        mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
        mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
        return mapper;
    }
    }
}

Спасибо. Как я могу затем сериализовать его обратно из моего объекта в Json String? Чтобы получить ту же строку, что и исходная.

Svajunas Kavaliauskas 18.04.2019 16:31
stackoverflow.com/questions/55728274/…
Dev_java 18.04.2019 16:57

Другие вопросы по теме