Spring Boot - возвращение JSON с массивом объектов - PullRequest
1 голос
/ 15 октября 2019

Используя этот ответ в качестве подсказки, я разработал контроллер Spring Boot для /greetings для возврата приветствия на разных языках в JSON.

Пока я получаю вывод в нужном формате (массив объектов), не могли бы вы сообщить мне, если есть лучший способ?

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;

@RestController
public class GreetingController {
    @GetMapping("/greetings")
    public HashMap<String, Object> getGreeting() {
        ArrayList<Object> al = new ArrayList<Object>();
        HashMap<String, String> map1 = new HashMap<String, String>();
        map1.put("en", "Greetings!");
        al.add(map1);
        HashMap<String, String> map2 = new HashMap<>();
        map2.put("hi", "Namaste!");
        al.add(map2);
        //
        HashMap<String, Object> finalMap = new HashMap<>();
        finalMap.put("all", al);
        return finalMap;
    }
}

Полученный (действительный) вывод:

{
    "all": [
        {
            "en": "Greetings!"
        },
        {
            "hi": "Namaste!"
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Хотя вы можете использовать вложенные List и Map объекты, ваш код становится нечитаемым довольно скоро. Лучше создавать реальные объекты. Например:

public class TranslatedGreeting {
  private String language;
  private String greeting;

  public TranslatedGreeting(String language, String greeting) {
    this.language = language;
    this.greeting = greeting;
  }

  // add getters
}

Затем используйте это в контроллере:

@RestController
public class GreetingController {

  @GetMapping("/greetings")
  public List<TranslatedGreeting> greetings() {
    List<TranslatedGreeting> result = new ArrayList<>();
    result.add(new TranslatedGreeting("en", "Greetings!"));
    result.add(new TranslatedGreeting("hi", "Namaste!");
    return result;
  }
}

Результирующий JSON будет выглядеть так:

[
  {"language":"en","greeting":"Greetings!"},
  {"language":"hi","greeting":"Namaste!"},
]

Эта структура JSON также прощесинтаксический анализ клиентов, поскольку ключи зафиксированы на language и greeting.

Если вы действительно хотите сохранить исходную структуру, объявите собственный сериализатор следующим образом:

@JsonComponent
public class TranslatedGreetingSerializer extends JsonSerializer<TranslatedGreeting> {
    @Override
    public void serialize(TranslatedGreeting translatedGreeting, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField(translatedGreeting.getLanguage(), translatedGreeting.getGreeting());
        jsonGenerator.writeEndObject();
    }
}

Thisвыдаст:

[
  {
    "en": "Greetings!"
  },
  {
    "hi": "Namaste!"
  }
]
0 голосов
/ 15 октября 2019

Если вам просто нужен массив объектов, вам не следует выбирать карту, а используйте тип List. Например, если у вас есть объекты приветствия и вы хотите вернуть список всех приветствий, ваш GetMapping будет выглядеть примерно так:

@GetMapping("/greetings")
    public ResponseEntity<List<Map<String,String>>> getGreeting() {
        ArrayList<Object> al = new ArrayList<Object>();
        HashMap<String, String> map1 = new HashMap<String, String>();
        map1.put("en", "Greetings!");
        al.add(map1);
        HashMap<String, String> map2 = new HashMap<>();
        map2.put("hi", "Namaste!");
        al.add(map2);
        return ResponseEntity.ok(al);
    }

Использование ResponseEntity гарантирует, что вы возвращаете правильный код состояния ипоскольку он оборачивает ваш ответ, его удобнее обслуживать.

Редактировать: Для пар ключ-значение, которые вы создали с помощью карты, вы можете использовать POJO.

class Greeting{
   private String greetingLangCode;
   private String greetingText;
   // getters and setters

 @JsonValue
public String info(){
 return this.greetingLangCode + ":" + "greetingText";
}
}

Сэта конечная точка изменится на

    @GetMapping("/greetings")
    public ResponseEntity<List<Greeting>> getGreeting() {
        List<Greeting> al = new ArrayList<>();
        al.add(new Greeting("en", "Greetings!"));
        al.add(new Greeting("hi", "Namaste!"));
        return ResponseEntity.ok(al);
    }

Но в случае, если описанное выше не работает, вам потребуется специальный сериализатор для сериализации, такой как пара key:value карты.

Возможно this пост полезен. В этом посте есть полный пример того, как писать пользовательские serializer и deserializer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...