3

json に変換したい履歴データがいくつかあります。これらはリストのリストです。それらの型は List[List[Position]] で、Position は単純なケース クラスです。Json.toJson の対処を支援するためのフォーマッターを作成しました。それぞれ 3 つのオブジェクトを含む 2 つの内部配列を持つ正確に 1 つの外部配列の出力を期待していました。代わりに手に入れたのはこれ。追加の配列ラッピングに注意してください。

[[[[{"amount":1.0,"minAmount":2.0,"price":3.0,"volume":4.0},
{"amount":5.0,"minAmount":6.0,"price":7.0,"volume":8.0},
{"amount":9.0,"minAmount":10.0,"price":11.0,"volume":12.0}]],
[[{"amount":0.1,"minAmount":0.2,"price":0.3,"volume":0.4},
{"amount":5.0,"minAmount":6.0,"price":7.0,"volume":8.0},
{"amount":9.0,"minAmount":10.0,"price":11.0,"volume":12.0}]]]]

ラッピング配列がどこから来たのかわかりません。ここで誰か助けてくれませんか?これは私が使用しているラッパーでのテストです:

class ApplicationSpec extends Specification {

  implicit object PositionFormat extends Format[List[List[Position]]] {
    def writes(historyList: List[List[Position]]) : JsValue = {
      Json.arr(historyList.map{
        o => Json.arr(o.map{ p =>
          Json.obj(
            "amount"    -> JsNumber(p.amount),
            "minAmount" -> JsNumber(p.minAmount),
            "price"     -> JsNumber(p.price),
            "volume"    -> JsNumber(p.volume)
          )
        })
      })
    }
    def reads(json: JsValue): JsResult[List[List[Position]]] = ???
  }

  "Application" should {

    "Convert position data to json" in {
      val l1 = ListBuffer(new Position(1.0D,2.0D,3.0D,4.0D),
        new Position(5.0D,6.0D,7.0D,8.0D),
        new Position(9.0D,10.0D,11.0D,12.0D)).toList
      val l2 = ListBuffer(new Position(0.1D,0.2D,0.3D,0.4D),
        new Position(5.0D,6.0D,7.0D,8.0D),
        new Position(9.0D,10.0D,11.0D,12.0D)).toList
      val obj = ListBuffer(l1,l2).toList
      val json = Json.toJson(obj)
      var string: String = json.toString()
      println(string)
    }
  }
}
4

1 に答える 1

9

Json.arr引数を取り、それらの JSON 配列の a を返すようJsValueです。それはあなたが単にできるように見えますJson.toJson

の使用方法arrは次のとおりです。

// Json.arr
Json.arr("one", "two")
// Gives you
// play.api.libs.json.JsArray = ["one","two"]

代わりに次のようにします。

// vs
val l = List("one", "two")
Json.arr(l)
// Gives you
// play.api.libs.json.JsArray = [["one","two"]]
// ... a nested array, which is what you don't want.

必要なものは次のとおりです。

// Json.toJson
Json.toJson(l)
// Gives you:
// play.api.libs.json.JsValue = ["one","two"]
于 2013-04-15T04:42:07.437 に答える