Spring json map элементы с разными именами в списке - PullRequest
1 голос
/ 06 мая 2019

Я использую весеннюю загрузку 2.1.4, и моя проблема с json map to object. Можно ли сопоставить JSON, как это

{
   "name":"test",
   "list1":1,
   "list2":2,
   "list3":3,
   "list4":4,
   "list5":5,
   "list6":6,
   "list7":7
}

возражать так:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test {

    private String name;
    private List<Integer> list;

}

в моем весеннем загрузочном контроллере это выглядит так:

@GetMapping("/criteria")
public String registration(@RequestBody Test test) {
    return "";
}

Есть ли способ сопоставить этот JSON с моим пользовательским объектом?

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Вы можете сделать собственный десериализатор для объекта, см. Ниже.

@JsonDeserialize(using = CustomDeserializer::class)
data class MyCustomObject(
    var name: String,
    var list: List<Int>
)

class CustomDeserializer: JsonDeserializer<MyCustomObject>(){
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): MyCustomObject {
        var myList = ArrayList<Int>()
        var myName = ""
        while(p.nextToken() != JsonToken.END_OBJECT){
            if(p.currentName() == "name"){
                myName = p.nextTextValue()
            }
            if(p.currentName().contains("list")){
                myList.add(p.nextIntValue(0))
            }
        }

        return MyCustomObject(myName, myList)
    }
}

Это было написано на Kotlin, если вам нужна моя помощь в преобразовании его в Java, дайте мне знать.

РЕДАКТИРОВАТЬ Вышли вперед и преобразовали его в Java для вас.Прошу прощения за любые опечатки :) дайте мне знать, если у вас есть какие-либо вопросы или проблемы

@JsonDeserialize(using = CustomDeserializer.class)
public class MyCustomObjectAgain {
    private String name;
    private List<Integer> myList;

    public MyCustomObjectAgain(String name, List<Integer> myList) {
        this.name = name;
        this.myList = myList;
    }

    private class CustomDeserializer extends JsonDeserializer<MyCustomObject>{
        @Override
        public MyCustomObject deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            List<Integer> myList = new ArrayList();
            String myName = "";
            while(p.nextToken() != JsonToken.END_OBJECT){
                if(p.currentName() == "name"){
                    myName = p.nextTextValue();
                }
                if(p.currentName().contains("list")){
                    myList.add(p.nextIntValue(0));
                }
            }

            return new MyCustomObject(myName, myList);
        }
    }
}
1 голос
/ 06 мая 2019

@ JsonAnySetter Если вы хотите использовать Map вместо List, вы можете рассмотреть @JsonAnySetter и в программе, где вам нужно, просто наберите properties.values()

Позволяет намгибкость использования карты в качестве стандартных свойств.При десериализации свойства из JSON будут просто добавлены на карту.

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test {

    private String name;
    private Map<String, String> properties;

    @JsonAnySetter
    public void add(String key, String value) {
       properties.put(key, value);
     }

}

Вы также можете попробовать с List, используя @JsonAnySetter

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test {

    private String name;
    private List<Integer> properties;

    @JsonAnySetter
    public void add(String key, Integer value) {
       properties.add(value);
     }

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