Чтобы понять это, вам нужно понять, что 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
Я написал специальный десериализатор для обработки временных меток в секундах (синтаксис 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
}
}
Очень похожий подход к методу @ 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;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="s")
public Date timestamp;
изменить: предложение vivek-kothari
@JsonFormat(shape=JsonFormat.Shape.NUMBER, pattern="s")
public Timestamp timestamp;
integer
, а не как string
в json.
– Renaud Cerrato
27 March 2015 в 16:15
{"timestamp" : "42"}
не совпадает с {"timestamp" : 42}
, и я предполагаю, что ваш JsonFormat
ожидает двойные кавычки.
– Renaud Cerrato
28 March 2015 в 08:44
java.time.Instant
и использовать обычные типы данных jackson . Таким образом вам просто нужно@JsonProperty("timestamp") private Instant timestamp
– Pierrick 20 March 2017 в 13:17