我有一个控制器处理类似'POST / doit'的路径,json主体使用Finatra内置工具(Jackson等)自动解析为案例类,如下所示:
class MyController extends Controller {
post("/doit") { request: MyRequest =>
// something
}
}
case class MyRequest(
id: String,
custom: String
)
以下是一些有效的请求:
{ "id": "my id", "custom": "my custom" }
{ "id": "my id", "custom": "{'x': 'y'}" }
正如你所看到的,'custom'字段可以是一个无法反序列化的JSON,因为Jackson希望它是一个POJO而不是String,我尝试用引号包装这个JSON但它们被忽略而且字段是作为JSON处理。
我怎样才能让杰克逊图书馆知道这个领域应该保持清晰?
我读过,我提出的最佳解决方案是编写自定义反序列化器,在这种情况下,我不知道如何与Finatra集成。
答案 0 :(得分:0)
正如“{Ryan O'Neill”在Finatra Google Group中指出的那样,有ExampleCaseClasses.scala编写自定义反序列化器的例子。
我正在复制以前scala源代码中的以下代码:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
case class CaseClassWithCustomDecimalFormat(
@JsonDeserialize(using = classOf[MyBigDecimalDeserializer])
myBigDecimal: BigDecimal,
@JsonDeserialize(using = classOf[MyBigDecimalDeserializer])
optMyBigDecimal: Option[BigDecimal])
class MyBigDecimalDeserializer extends JsonDeserializer[BigDecimal] {
override def deserialize(jp: JsonParser, ctxt: DeserializationContext): BigDecimal = {
val jsonNode: ValueNode = jp.getCodec.readTree(jp)
BigDecimal(jsonNode.asText).setScale(2, RoundingMode.HALF_UP)
}
override def getEmptyValue: BigDecimal = BigDecimal(0)
}
谢谢Ryan。