Spring boot JsonMappingException: объект равен нулю - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть @RestController, который возвращает net.sf.json.JSONObject:

@PostMapping("/list")
public JSONObject listStuff(HttpServletRequest inRequest, HttpServletResponse inResponse) {
    JSONObject json = new JSONObject();
    ...
    return json;
}

Когда JSONObject содержит нулевую ссылку, выдается следующее исключение:

Could not write JSON: Object is null; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Object is null (through reference chain: net.sf.json.JSONObject[\"list\"]->net.sf.json.JSONArray[0]->net.sf.json.JSONObject[\"object\"]->net.sf.json.JSONNull[\"empty\"])"

Этоустаревший код, который мы сейчас очищаем, и в какой-то момент мы избавимся от явных манипуляций с JSON, но это будет огромным изменением, а сейчас я бы хотел просто избавиться от исключения.Я пробовал следующие решения:

  1. Определить Include.NON_NULL в Spring Mapper Object - так что этот кусок кода в моем WebMvcConfigurationSupportClass:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) 
{
    ObjectMapper webObjectMapper = objectMapper.copy();
    webObjectMapper.setSerializationInclusion(Include.NON_NULL);
    converters.add(new MappingJackson2HttpMessageConverter(webObjectMapper)); 
}
Установка следующего свойства в application.yml: spring.jackson.default-property-inclusion=non_null Проверка версии com.fasterxml.jackson - в дереве зависимостей найдено только 2,9.7.

Нетпомогло все вышеперечисленное.

Есть предложения о том, как заставить Spring игнорировать нулевые значения в net.sf.json.JSONObjects?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Это не идеальное решение, а скорее обходной путь.Поскольку переопределение стандартного поведения преобразователя / преобразователя не сработало, вместо этого я изменил структуру моего JSONObject, поэтому добавил при генерации следующую строку:

listElt.put("object", "");

, которая выдает: { "list" : [ { "object" : "" } ] }

Это нормально, только если меня не интересует значение этого поля - и я не заинтересован.Я лично предпочитаю решение @ Michał Ziober - оно элегантное и универсальное.К сожалению, не работает для меня.

0 голосов
/ 18 февраля 2019

Include.NON_NULL не работает, потому что JSONNull представляет null, но это не null как таковое .Из документации :

JSONNull эквивалентно значению, которое JavaScript называет нулевым, в то время как значение NULL Java эквивалентно значению, которое JavaScript вызывает неопределенным.

Этот объект реализован как Singleton, который имеет два метода: isArray и isEmpty, где isEmpty проблематично, поскольку выдает исключение.Ниже приведен фрагмент его реализации:

public boolean isEmpty() {
   throw new JSONException("Object is null");
}

Лучший способ - определить NullSerializer для JSONNull типа.Ниже приведен пример того, как мы можем настроить это:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
import net.sf.json.JSONArray;
import net.sf.json.JSONNull;
import net.sf.json.JSONObject;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        SimpleModule netSfJsonModule = new SimpleModule("net.sf.json");
        netSfJsonModule.addSerializer(JSONNull.class, NullSerializer.instance);

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(netSfJsonModule);

        JSONObject object = new JSONObject();
        object.accumulate("object", JSONNull.getInstance());

        JSONArray jsonArray = new JSONArray();
        jsonArray.add(object);

        JSONObject json = new JSONObject();
        json.accumulate("list", jsonArray);

        System.out.println(mapper.writeValueAsString(json));
    }
}

Над отпечатками кода:

{
  "list" : [ {
    "object" : null
  } ]
}

См. Также:

  1. Maven: отсутствует сеть.sf.json-lib
  2. Как переопределить нулевой сериализатор в Jackson 2.0?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...