Получение неструктурированных файлов JSON в ресурсах Spring

#java #spring #spring-boot

#java #spring #spring-загрузка

Вопрос:

В настоящее время у меня есть ресурс следующим образом

 @PostMapping("/color")
public String addColorData(@RequestBody Object obj){
    System.out.println(obj.toString());
    return "200";
}
 

и когда я публикую JSON ниже

{ «color»: «Green», «mixutres»: { «Yellow»: 0.5, «random2»: 0.5 } }

печать, как и ожидалось — {color = Green, mixutres = {Yellow = 0.5, random2 = 0.5}}

Однако,

Когда я создаю класс Color

 public class Color  {

    private String color;

    private Object mixtures;


    public Object getMixtures() {
        return mixtures;
    }

    public void setMixtures(Object mixtures) {
        this.mixtures = mixtures;
    }
 

и измените мой ресурс, как показано ниже

 @PostMapping("/color")
public String addColorData(@RequestBody Color colorObj){
    System.out.println(colorObj.toString());
    return "200";
}
 

смеси заканчиваются как ‘null’

{color=Green, mixtures=’null’}

  1. Почему смеси заканчиваются как «null»?
  2. Предполагая, что я не знаю точной структуры смесей, является ли установка типа смесей как объекта правильным подходом? Если нет, не могли бы вы, ребята, дать мне несколько советов по лучшим практикам?

Спасибо

— Последующие действия —

Благодаря Gulliva обнаружена опечатка в моем JSON, когда я тестировал после редактирования

Spring вернул следующее

трассировка»: «org.springframework.http.converter.HttpMessageNotReadableException: ошибка синтаксического анализа JSON: не удается десериализовать экземпляр java.lang.String из токена START_OBJECT; вложенным исключением является com.fasterxml.jackson.databind.exc.MismatchedInputException: не удается десериализовать экземпляр java.lang.String из токена START_OBJECT n в [Источник: (PushbackInputStream); строка: 5, столбец: 18] (через цепочку ссылок:

…. «сообщение»: «Ошибка синтаксического анализа JSON: не удается десериализовать экземпляр java.lang.String из токена START_OBJECT; вложенным исключением является com.fasterxml.jackson.databind.exc.MismatchedInputException: не удается десериализовать экземпляр java.lang.String из токена START_OBJECT n в [Источник: (PushbackInputStream); строка: 5, столбец: 18](через цепочку ссылок:

Комментарии:

1. можете ли вы показать геттеры и сеттеры

2. Не могли бы вы добавить класс mixtures?

Ответ №1:

Если ваш пример вверху верен, значит, у вас опечатка в ключе «смеси».

Одно из предложений здесь. Рассмотрите возможность использования ResponseBody в качестве вашего ResponseEntity. Поскольку ResponseBody является универсальным классом, вы можете использовать его с типом, который вам нравится, и задать HTTP StatusCode, например

ResponseEntity.ok("hello world);

Комментарии:

1. Спасибо, что указали на опечатку! после изменения возникла другая проблема: (

Ответ №2:

Если ваша структура представляет собой просто значение пары ключей, вы можете использовать смеси Map<String, String>, которые я предпочитаю ds, и ваш класс будет выглядеть следующим образом :

 public class Color  {

private String color;

private Map<String, String> mixtures;


public Map<String,String> getMixtures() {
    return mixtures;
}

public void setMixtures(Map<String,String> mixtures) {
    this.mixtures = mixtures;
}
 

Поскольку использование структуры типа collection также будет полезно в будущем для доступа / изменения данных.