java jackson mapper конвертирует временную метку unix на сегодняшний день, результат неправильный [дубликат]

Чтобы понять это, вам нужно понять, что Node.js фактически переносит ваш код модуля в функцию, например

(function (exports, require, module, __filename, __dirname) {
    var test = function(){
        console.log('From test: '  + this);
    };
    console.log(this);
    test();
});

Подробное объяснение можно найти в этом ответе .


Теперь эта завернутая функция - это , которая действительно вызывается, как это

var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);

Итак, this, на уровне модуля , фактически является объектом exports.

Вы можете подтвердить, что, подобно этому

console.log(this, this === module.exports);
// {} true

22
задан Drew Stephens 17 December 2013 в 15:39
поделиться

3 ответа

Я написал специальный десериализатор для обработки временных меток в секундах (синтаксис Groovy).

class UnixTimestampDeserializer extends JsonDeserializer<DateTime> {
    Logger logger = LoggerFactory.getLogger(UnixTimestampDeserializer.class)

    @Override
    DateTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String timestamp = jp.getText().trim()

        try {
            return new DateTime(Long.valueOf(timestamp + '000'))
        } catch (NumberFormatException e) {
            logger.warn('Unable to deserialize timestamp: ' + timestamp, e)
            return null
        }
    }
}

И затем я аннотировал мой POGO, чтобы использовать это для метки времени:

class TimestampThing {
    @JsonDeserialize(using = UnixTimestampDeserializer.class)
    DateTime timestamp

    @JsonCreator
    public TimestampThing(@JsonProperty('timestamp') DateTime timestamp) {
        this.timestamp = timestamp
    }
}
24
ответ дан Drew Stephens 22 August 2018 в 19:02
поделиться
  • 1
    Привет, просто из любопытства, что такое диалект Java? Благодаря! – tuscland 10 October 2015 в 12:45
  • 2
    Работает как шарм в обычной скучной java, тоже. Просто используйте Annotation в любом поле DateTime, в котором вы нуждаетесь. Не пытались использовать Java 8 Date, но там тоже не проблема. благодаря – thomi 10 October 2015 в 15:10
  • 3
    @tuscland Groovy – Drew Stephens 7 January 2016 в 22:07
  • 4
    Если вы можете использовать java8, вам может быть интересно использовать класс java.time.Instant и использовать обычные типы данных jackson . Таким образом вам просто нужно @JsonProperty("timestamp") private Instant timestamp – Pierrick 20 March 2017 в 13:17
  • 5
    @Pierrick Пожалуйста, превратите это в ответ, чтобы я мог повышать ;-) – lilalinux 15 March 2018 в 11:45

Очень похожий подход к методу @ DrewStephens, который использует API-интерфейс Java SE TimeUnit (представленный в JDK1.5) вместо простой конкатенации строк и, следовательно, (возможно) немного чище и выразительнее:

public class UnixTimestampDeserializer extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser parser, DeserializationContext context) 
            throws IOException, JsonProcessingException {
        String unixTimestamp = parser.getText().trim();
        return new Date(TimeUnit.SECONDS.toMillis(Long.valueOf(unixTimestamp)));
    }
}

Указание вашего пользовательского десериализатора (UnixTimestampDeserializer) в поврежденном поле (f6):

@JsonDeserialize(using = UnixTimestampDeserializer.class)
private Date updatedAt;
7
ответ дан Priidu Neemre 22 August 2018 в 19:02
поделиться
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="s")
public Date timestamp;

изменить: предложение vivek-kothari

@JsonFormat(shape=JsonFormat.Shape.NUMBER, pattern="s")
public Timestamp timestamp;
12
ответ дан sherpya 22 August 2018 в 19:02
поделиться
  • 1
    почему downvote? потому что это проще, чем другие решения? – sherpya 2 October 2014 в 01:24
  • 2
    вероятно, потому, что его метки времени представлены как integer, а не как string в json. – Renaud Cerrato 27 March 2015 в 16:15
  • 3
    Джексон требует преобразования типа – sherpya 27 March 2015 в 16:47
  • 4
    {"timestamp" : "42"} не совпадает с {"timestamp" : 42}, и я предполагаю, что ваш JsonFormat ожидает двойные кавычки. – Renaud Cerrato 28 March 2015 в 08:44
  • 5
    Это не работает, потому что это {{s}} означает не секунды с 1970 года, это означает, что секунды "заданы" дата (0..59) – Ralph 31 July 2015 в 10:11
Другие вопросы по тегам:

Похожие вопросы: