Джексон YAML - сериализировать ноль как пустое значение - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь настроить сериализацию строк, чтобы избежать «нулевых» значений в файле YAML.

Код, который у меня пока есть:

YAMLFactory yamlFactory = new YAMLFactory();
ObjectMapper mapper = new ObjectMapper(yamlFactory);
DefaultSerializerProvider sp = new DefaultSerializerProvider.Impl();
sp.setNullValueSerializer(new NullSerializer());
ObjectMapper m = new ObjectMapper();
mapper.setSerializerProvider(sp);

Map<String, Object> data = new HashMap<>();
data.put("aString", "test");
data.put("aNullObject", null);
data.put("anEmptyString", "");

String output = mapper.writeValueAsString(data);
System.out.println(output);

NullSerializer:

public class NullSerializer extends JsonSerializer<Object> {
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        jgen.writeString("");
    }
}

Результат:

---
aNullObject: ""
aString: "test"
anEmptyString: ""

Проблема в том, что writeString пишет пустую строку, и я пытаюсь получить пустое значение полностью.

Желаемый результат:

---
aNullObject: 
aString: "test"
anEmptyString: ""

Я пытался использовать jgen.writeRaw("");, но я получаю эту ошибку:

Caused by: java.lang.UnsupportedOperationException: Operation not supported by generator of type com.fasterxml.jackson.dataformat.yaml.YAMLGenerator
    at com.fasterxml.jackson.core.JsonGenerator._reportUnsupportedOperation(JsonGenerator.java:1967)
    at com.fasterxml.jackson.dataformat.yaml.YAMLGenerator.writeRaw(YAMLGenerator.java:590)
    at com.example.jackson.NullSerializer.serialize(NullSerializer.java:13)
    at com.fasterxml.jackson.databind.SerializerProvider.defaultSerializeNull(SerializerProvider.java:1127)
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:711)
    ... 7 more

1 Ответ

0 голосов
/ 20 декабря 2018

У меня была похожая проблема, но используя перечисление (или объект), а не строку, вы можете напрямую реализовать сериализатор и решить добавить или удалить "" "перед сериализацией информации.

Например

public class Data {
  private String aString;
  private MyData aNullObject;
  private String anEmptyString;
 ...
}

public class MyData {
  private String value;
  ....
}

public class MySerializer {
  @Override
    public void serialize(
            MyData data, JsonGenerator jgen, SerializerProvider provider)
            throws IOException {

        YAMLGenerator yamlGenerator = (YAMLGenerator) jgen;
        //DISABLE QUOTES
        yamlGenerator.enable(YAMLGenerator.Feature.MINIMIZE_QUOTES);
        yamlGenerator.writeString(data.getValue());
        //ENABLE QUOTES AGAIN
        yamlGenerator.disable(YAMLGenerator.Feature.MINIMIZE_QUOTES);
    }

}

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
SimpleModule module = new SimpleModule();
module.addSerializer(MyData.class, new MySerializer());
mapper.registerModule(module);

Я надеюсь объяснить правильно ...

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