FasterXML / FasterXML/jackson-modules-java8
OffsetTimeSerializer not writing seconds for time object like 15:30:00Z (where seconds is 00)
- Linguagem predominante
- Java
- Estrelas
- 425
- Forks
- 124
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Descrição
When having a `OffsetTime` field with e.g. `15:00:00Z` and serializing this with Jackson it outputs:
`15:00Z` and thus the seconds are lost.
Note I have the time module registered via `JavaTimeModule()`.
Although one could argue that the seconds are not needed this gives some problems when validating outputted data against JSON schema.
when using the JSON schema format `time` then the seconds are expected, see https://json-schema.org/understanding-json-schema/reference/string#dates-and-times
without the seconds the JSON schema validator fails with: The value must be a valid time.
(note I'm using [Justify](https://github.com/leadpony/justify) for schema validation)
Looking at the source code, I see this is done on purpose
https://github.com/FasterXML/jackson-modules-java8/blob/master/datetime/src/main/java/tools/jackson/datatype/jsr310/ser/OffsetTimeSerializer.java#L92-L111
```
private final void _serializeAsArrayContents(OffsetTime value, JsonGenerator g,
SerializerProvider provider)
throws JacksonException
{
g.writeNumber(value.getHour());
g.writeNumber(value.getMinute());
final int secs = value.getSecond();
final int nanos = value.getNano();
if ((secs > 0) || (nanos > 0)) {
g.writeNumber(secs);
if (nanos > 0) {
if(useNanoseconds(provider)) {
g.writeNumber(nanos);
} else {
g.writeNumber(value.get(ChronoField.MILLI_OF_SECOND));
}
}
}
g.writeString(value.getOffset().toString());
}
```
Is it possible to override this behaviour?
Currently I think my only option is create a custom Serializer?
If not possible to override this behaviour would it be at least possible to change this `_serializeAsArrayContents` method from `private` to `protected` so one could simply extend this class and override this method?
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Direção de pesquisa
Comece por datetime/src/main/java/tools/jackson/datatype/jsr310/ser/OffsetTimeSerializer.java, especialmente _serializeAsArrayContents, e reproduza a serialização de 15:00:00Z com JavaTimeModule. Confirme a representação de tempo esperada em JSON e determine se o comportamento solicitado ou um hook de serializer sobrescrevível é apropriado; considera-se concluído quando o comportamento estiver coberto por um teste de regressão.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- java
- Domínio
- api, backend
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 35/100