Разбор сложного JSON запроса весной - PullRequest
0 голосов
/ 23 января 2020

Я разрабатываю сервис RESTful, используя Java и Spring-Boot, и столкнулся с проблемой. Я получаю запрос на поставку с телом запроса:

    {
     "key":{
       "par1":"val1",
       "par2":"val2"
      },
     "data":{
        "par1":"val1",
        "par2":"val"
      }
   }

Для его анализа мне нужно создать собственный тип @RequestBody. Вот оно:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeType;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.util.JSONWrappedObject;

import java.io.Serializable;
import java.util.Map;

public class UpdateInfo {

    private Map<String, Object> mapKey;
    private Map<String, Object> mapData;

    ObjectMapper mapper;

    public void setMapKey(JsonNode key) {
        this.mapKey = mapper.convertValue(key,  new TypeReference<Map<String, Object>>(){});
    }

    public void setMapData(JsonNode) {
        this.mapData = mapper.convertValue(data,  new TypeReference<Map<String, Object>>(){});
    }

    public Map<String, Object> getKeys() {
        return mapKey;
    }

    public Map<String, Object> getData() {
        return mapData;
    }

}

По логике оно должно работать, но я получаю сообщение об ошибке:

    [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: null; nested exception is com.fasterxml.jackson.databind.JsonMappingException: N/A
 at [Source: (PushbackInputStream); line: 6, column: 3] (through reference chain: com.sas.rus.spm.UpdateInfo["key"])]

Не могу понять причину, надеюсь на вашу помощь

Ответы [ 2 ]

1 голос
/ 23 января 2020

Просто попробуйте:

public class UpdateInfo {

    private Map<String, Object> key;
    private Map<String, Object> data;
    //getter and setter

    public Map<String, Object> getKey(){
        return key;
    }

    public void setKey(Map<String,Object> key){
         this.key = key
    }

    public Map<String, Object> getData(){
        return data;
    }

    public void setData(Map<String,Object> data){
         this.data = data
    }

}
0 голосов
/ 24 января 2020

JSON ошибка разбора: null это просто потому, что вы не инициализировали mapKey и mapData, а метод getter возвращает ноль.

Также измените метод getKeys () на getKey () , как в json ваша клавиша json является ключевой.

Ваш класс будет выглядеть как

public class UpdateInfo {

private Map<String, Object> mapKey = new HashMap<>();
private Map<String, Object> mapData = new HashMap<>();

ObjectMapper mapper;

public void setMapKey(JsonNode key) {
    this.mapKey = mapper.convertValue(key, new TypeReference<Map<String, Object>>() {
    });
}

public void setMapData(JsonNode data) {
    this.mapData = mapper.convertValue(data, new TypeReference<Map<String, Object>>() {
    });
}

public Map<String, Object> getKey() {
    return mapKey;
}

public Map<String, Object> getData() {
    return mapData;
}
}
...