Преобразование RequestBody json в объект — Spring Boot

Я новичок в разработке Java, но уже имею опыт работы с такими языками программирования, как PHP и Python. Так немного запутался в том, как продолжить весеннюю загрузку с разработкой.

Я разрабатываю API для отдыха, который имеет следующий запрос

{
  "key":"value",
  "key1":"value1",
  "platform_settings":[
      {"key":"value"}
  ]
}

Что я сделал

Я создал RestController, который принимает http-запрос и создал функцию для ресурса.

public Share share(@RequestBody final Share share) { 
        LOGGER.debug("This is the request", share);
        return share; //
}

Вопрос 1: Если бы это был любой другой язык программирования, такой как PHP или Python, была бы вспомогательная функция, которая примет запрос json и преобразует его в объект, с которым я могу легко работать.

В питоне это так же просто, как

import json
import requests

response = requests.get(...)
json_data = json.loads(response.text)
//can work on json_data anyway I want.

Но в java мне нужно будет создать класс POJO или иметь объект jackson/JPA в качестве зависимости, который будет отображать запрос в класс (который я должен предварительно определить с запросами).

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

Entity

package com.payunow.socialsharemodule.models;

import java.util.Map;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;


import javax.persistence.Id;


@Entity
public class Share {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String key;
    private String key1;
    private Map<String,String> platform_settings;

    public Share(String name, String description,Map<String,String> platform_settings) {
        this.key = key;
        this.key1 = key1;
        this.platform_settings = platform_settings;
    }

    //for JPA
    public Share() {}

    public String getKey() {
        return key;
    }

    public String getKey1() {
        return key1;
    }

    public Map<String,String> getPlatform_settings() {
        return platform_settings;
    }

}

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


person Ajeesh    schedule 30.03.2017    source источник
comment
@Japu_D_Cret Это не дубликат. Прочитайте мой вопрос, прежде чем комментировать, пожалуйста!   -  person Ajeesh    schedule 30.03.2017
comment
вроде так, принятый ответ, на который я ссылался, использует библиотеку json-simple, которая не заставляет вас создавать оболочку для вашего ответа, вы можете работать с такими объектами, как JSONArray и JSONObject, а затем соответствующим образом преобразовывать эти объекты. Но если ваш ответ каждый раз имеет один и тот же формат, я предлагаю создать класс-оболочку для Джексона.   -  person Japu_D_Cret    schedule 30.03.2017
comment
@Japu_D_Cret Если вы видите вопрос, мой вопрос касается обработки запроса и должен ли я всегда сопоставлять запрос с классом или нет. И ваш ответ относится к использованию в приложении J2ME, а не в приложении Springboot.   -  person Ajeesh    schedule 30.03.2017
comment
связал неправильный ответ, см. json-to-java и вот как преобразовать строку JSON с помощью json-simple stackoverflow.com/questions/30757136/   -  person Japu_D_Cret    schedule 30.03.2017
comment
whether should I always map request to a class or not если вы хотите получить все до последней крупицы производительности при обработке ответов, то либо вообще не анализируйте json, либо анализируйте его только настолько, насколько это необходимо, с помощью json-simple. Если вы хотите надежно работать с ответом и иметь строго типизированный объект, с которым удобнее работать, чем я предлагаю вам взять небольшой дефицит времени и полностью преобразовать его в POJO с Джексоном или тому подобное. Если вы хотите работать с ней так же, как с Python, вам подойдет библиотека json-simple.   -  person Japu_D_Cret    schedule 30.03.2017
comment
чтобы пользователи StackOverflow могли дать вам более подробный ответ, добавьте дополнительные сведения в свой вариант использования. Сколько запросов в минуту, насколько велики ответы, анализируются ли они или только в действительно конкретном случае (исключение)? также извините за неправильное толкование вашего вопроса сначала   -  person Japu_D_Cret    schedule 30.03.2017
comment
@Japu_D_Cret Я привел очень простой пример запроса и вопросов, которые у меня есть. Не уверен, что смогу уточнить это подробнее. Но спасибо за попытку ответить   -  person Ajeesh    schedule 30.03.2017


Ответы (2)


Вам нужно иметь зависимость Джексона для покрытия json объекта java. Но Spring предоставляет его по умолчанию, поэтому вам не нужно добавлять его явно.

Вам не нужна сущность JPA. Это нужно только тогда, когда вы хотите сохранить полученные данные в базе данных.
Просто для того, чтобы получить запрос, вам не нужно создавать отдельный класс pojo. Посмотрите на этот код

@PostMapping("/json")
public JSONObject getGeneric(@RequestBody String stringToParse){
        JSONParser parser = new JSONParser();
        JSONObject json = null;
        try {
            json = (JSONObject) parser.parse(stringToParse);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    return json;
}   

Как вы можете видеть здесь, он принимает строку как запрос и преобразует ее в общий JSONObject. Таким образом, вы можете передать любой json в эту конечную точку.

person pvpkiran    schedule 30.03.2017

Вы можете использовать класс ObjectMapper, у него есть такие методы, как convertValue и realValue.

person Mohit Mokasana    schedule 31.07.2020