According to the protobuf issue, int64, uint64 type is serialized into string due to a Javascript precision problem. And it seems spray cannot read the string field as Long type.
for example:
case class definition: case class Test(id: String, timestamp: Long)
protobuf IDL definition:
message Test {
string id = 1;
int64 timestamp = 2;
}
the output string from protobuf json looks like:
{
"id": "xyz",
"timestamp": "1648867560"
}
When spray parse the timestamp field as Long, got the exception: "Expected Long as JsNumber, but got "1648867560" "
Suggest:
Add the String match case for LongJsonFormat:
implicit object LongJsonFormat extends JsonFormat[Long] {
def write(x: Long) = JsNumber(x)
def read(value: JsValue) = value match {
case JsNumber(x) if x.isValidLong => x.longValue
case JsString(x) => BigDecimal(x).longValue
case x => deserializationError("Expected Long as JsNumber, but got " + x)
}
}
According to the protobuf issue, int64, uint64 type is serialized into string due to a Javascript precision problem. And it seems spray cannot read the string field as Long type.
for example:
case class Test(id: String, timestamp: Long)
the output string from protobuf json looks like:
When spray parse the timestamp field as Long, got the exception: "Expected Long as JsNumber, but got "1648867560" "
Suggest: Add the String match case for LongJsonFormat: