2016-08-09 1 views
0

は、私は「POST /のdoIt」のようなルートを扱うコントローラを持って、JSON本体は自動的にツールに組み込まれFinatra(ジャクソン、など)、このようなものを使用した場合のクラスに解析されいくつかの有効な要求:はどうすればFinatraはケースクラスに要求を解析している間、プレーンとして保持されるようにフィールドを設定することができますか?</p> <pre><code>class MyController extends Controller { post("/doit") { request: MyRequest => // something } } case class MyRequest( id: String, custom: String ) </code></pre> ここ<p>です:

{ "id": "my id", "custom": "my custom" } 

{ "id": "my id", "custom": "{'x': 'y'}" } 

あなたが見ることができるように、「カスタム」フィールドには、ジャクソンが、それはPOJOの代わりに、文字列であることを期待しているため、デシリアライズすることはできませんJSONすることができ、私は引用符で、このJSONをラップしようとしましたしかし、それらは無視され、フィールドがJSONとして扱われます。

は、どのように私は、このフィールドはプレーン保たれるべきであることを知ることがジャクソンライブラリさせることができますか?

私が読んでいたし、私が思いついた最善の解決策は、カスタムデシリアライザを書くことで、この場合には、私がどのようにFinatraと統合していないアイデアを持っています。

答えて

0

Finatra Google Groupで指摘された "Ryan O'Neill"のように、ExampleCaseClasses.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) 
} 

おかげでライアン:

私は、以前のScalaのソースから次のコードをコピーしています。

関連する問題

 関連する問題