Java GSON Выход из обратной косой черты в настраиваемом сериализаторе - PullRequest
1 голос
/ 04 февраля 2020

Мне нужно сериализовать Java LocalDate (например, 2020-02-04) в следующий формат: "myProperty":"\/Date(-2209165200000+0100)\/", как интерфейс, с которым мы работаем с запросами этого формата. В настоящее время мы используем новейшую версию GSON (2.8.6)

Наш пользовательский LocalDate Serializer выглядит следующим образом:

public class LocalDateSerializer implements JsonSerializer<LocalDate> {

  @Override
    public JsonElement serialize(LocalDate src, Type typeOfSrc, JsonSerializationContext context) {
        Instant instant = src.atStartOfDay(ZoneId.systemDefault()).toInstant();
        long timeInMillis = instant.toEpochMilli();
        ZoneOffset offset = OffsetDateTime.now().getOffset();
        return context.serialize("\\/Date(" + timeInMillis + offset + ")\\/");
    }
}

Проблема сейчас в том, насколько я знать, что функция context.serialize избегает двойной обратной косой черты, поэтому конечный результат - "myProperty":"\\/Date(-2209165200000+0100)\\/" вместо "myProperty":"\/Date(-2209165200000+0100)\/". И в Java 1.8 вам не разрешается просто иметь строку типа "\/", так как это приведет к в ошибке компилятора.

Есть ли какой-нибудь простой способ получить наш результат с одинарной обратной косой чертой?

Спасибо и всего наилучшего:)

Marco

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Как указано в RF C 7159 , \/ представляет собой экранированный прямой слэ sh и декодирует в \.

Следовательно, вы хотите вернуть context.serialize("/Date(" + timeInMillis + offset + ")/");.

0 голосов
/ 11 февраля 2020

Мы исправили нашу проблему, возвращая новый JsonPrimitive вместо использования context

Итак, мы используем return new JsonPrimitive("/Date(" + timeInMillis + offset + ")/"); сейчас, и теперь все работает нормально. Тем не менее, спасибо за вклад, очень ценится!

...