7

JSON へのシリアライズと JSON からのデシリアライズが必要な Scala アプリを作成しています。一部の JSON オブジェクトには 22 を超えるフィールドがあるため、ケース クラスを使用できません (また、形式を変更することもできません)。私が見つけることができたすべての Scala JSON ライブラリは、通常のクラスではなく、ケース クラスでのみ (簡単に) 動作します。

それを考えると、大きな JSON オブジェクト (22 を超えるフィールドを持つ) を Scala 非ケース クラスに逆シリアル化する最も簡単な方法は何ですか? 完全に自動化する必要はありませんが、理想的には、Map[String, Any] にデシリアライズして手動ですべてを行うよりも簡単なものを探しています。

4

3 に答える 3

3

The Play JSON library with genericsを使用してケースクラスなしでそれを行うことは可能です

何もせずにコーヒーを飲んでいたとき。私は自由にあなたのために例をコーディングしました。完全なソリューションは次のとおりです。

まず第一に、これはあなたのクラスです:

import play.api.libs.json._
import play.api.libs.json.Json._


    class TestJSON(
      val field1: String,
      val field2: String,
      val field3: String,
      val field4: String,
      val field5: String,
      val field6: String,
      val field7: String,
      val field8: String,
      val field9: String,
      val field10: String,
      val field11: String,
      val field12: String,
      val field13: String,
      val field14: String,
      val field15: String,
      val field16: String,
      val field17: String,
      val field18: String,
      val field19: String,
      val field20: String,
      val field21: String,
      val field22: String,
      val field23: String) {

    }

    object TestJSON {
      //
      // JSON BINDING/UNBINDING
      //

      implicit def modalityReads: Reads[TestJSON] = new Reads[TestJSON] {
        def reads(json: JsValue): TestJSON =
          new TestJSON(
            field1 = (json \ "field1").as[String],
            field2 = (json \ "field2").as[String],
            field3 = (json \ "field3").as[String],
            field4 = (json \ "field4").as[String],
            field5 = (json \ "field5").as[String],
            field6 = (json \ "field6").as[String],
            field7 = (json \ "field7").as[String],
            field8 = (json \ "field8").as[String],
            field9 = (json \ "field9").as[String],
            field10 = (json \ "field10").as[String],
            field11 = (json \ "field11").as[String],
            field12 = (json \ "field12").as[String],
            field13 = (json \ "field13").as[String],
            field14 = (json \ "field14").as[String],
            field15 = (json \ "field15").as[String],
            field16 = (json \ "field16").as[String],
            field17 = (json \ "field17").as[String],
            field18 = (json \ "field18").as[String],
            field19 = (json \ "field19").as[String],
            field20 = (json \ "field20").as[String],
            field21 = (json \ "field21").as[String],
            field22 = (json \ "field22").as[String],
            field23 = (json \ "field22").as[String])
      }

      implicit def modalityWrites: Writes[TestJSON] = new Writes[TestJSON] {
        def writes(ts: TestJSON) = JsObject(Seq(
          "field1" -> JsString(ts.field1),
          "field2" -> JsString(ts.field2),
          "field3" -> JsString(ts.field3),
          "field4" -> JsString(ts.field4),
          "field5" -> JsString(ts.field5),
          "field6" -> JsString(ts.field6),
          "field7" -> JsString(ts.field7),
          "field8" -> JsString(ts.field8),
          "field9" -> JsString(ts.field9),
          "field10" -> JsString(ts.field10),
          "field11" -> JsString(ts.field11),
          "field12" -> JsString(ts.field12),
          "field13" -> JsString(ts.field13),
          "field14" -> JsString(ts.field14),
          "field15" -> JsString(ts.field15),
          "field16" -> JsString(ts.field16),
          "field17" -> JsString(ts.field17),
          "field18" -> JsString(ts.field18),
          "field19" -> JsString(ts.field19),
          "field20" -> JsString(ts.field20),
          "field21" -> JsString(ts.field21),
          "field22" -> JsString(ts.field22),
          "field23" -> JsString(ts.field23)))
      }
    }

コントローラーは次のようになります。

import play.api._
import play.api.mvc._
import play.api.libs.json.Json._
import play.api.Play.current
import models.TestJSON

object Application extends Controller  {

  def getJson = Action {
    implicit request =>
      Ok(
        toJson(
          Seq(
            toJson(
              new TestJSON(
                "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
                "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23")),
              toJson(new TestJSON(
                "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
                "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23")))))
  }

}

ルート ファイル (アクションをルーティングするだけ):

GET     /getJson                             controllers.Application.getJson

そして今、決定的瞬間…

curl localhost:9000/getJson
[{"field1":"1","field2":"2","field3":"3","field4":"4","field5":"5","field6":"6",
"field7":"7","field8":"8","field9":"9","field10":"10","field11":"11","field12":"
12","field13":"13","field14":"14","field15":"15","field16":"16","field17":"17","
field18":"18","field19":"19","field20":"20","field21":"21","field22":"22","field
23":"23"},{"field1":"1","field2":"2","field3":"3","field4":"4","field5":"5","fie
ld6":"6","field7":"7","field8":"8","field9":"9","field10":"10","field11":"11","f
ield12":"12","field13":"13","field14":"14","field15":"15","field16":"16","field1
7":"17","field18":"18","field19":"19","field20":"20","field21":"21","field22":"2
2","field23":"23"}]

逆の方法でも機能するはずです。私は現在、それを使用して巨大なツリーを組み立てたり分解したりするプロジェクトに取り組んでいるので、うまくいくはずです。お知らせ下さい。

乾杯!

PS:コードを生成するのに約 10 分かかりました。List.range(1,24) をマップし、「foreach」してコードを出力しました。

于 2012-12-18T03:42:29.020 に答える
1

Lift JSON API を確認してください。

重要なのは、解析されるすべてのものが のサブクラスとして返されることですJValue。のようなオブジェクト

{
  "a": [1, 2],
  "b": "hello"
}

次のように解析されます

JObject(List(
  JField("a", JArray(List(JInt(1), JInt(2)))),
  JField("b", JString("hello"))
))

Lift API は\Map. extractOpt[A]解析された JSON を必要なものに変換するために最善を尽くすメソッドもありAます。それらと遊んで、その感触をつかんでください。

于 2012-12-18T03:53:24.153 に答える