Sphereとともに

scalaとかplayframeworkとか。技術ブログにしたいなと。環境は Windows7x64, mac です。たまに声優さん情報が混ざります。最近ちょっとClojure触りました。

【playframework】json 形式でデータを返すときにハマったこと

def ticketToJson(list: List[models.Ticket]) = {
	Json.toJson(
		Map("tickets" -> Seq(
			list.map(ticket => {
				toJson(
					Map(
						"id" -> toJson(ticket.id.get),
						"username" -> toJson(ticket.username),
						"artist" -> toJson(ticket.artist),
						"livename" -> toJson(ticket.livename),
						"rest" -> toJson(ticket.rest),
						"livedate" -> toJson(ticket.livedate),
						"isEnd" -> toJson(ticket.isEnd),
						"registrydate" -> toJson(ticket.registrydate),
						"place" -> toJson(ticket.place),
						"comment" -> toJson(ticket.comment),
						"isPublic" -> toJson(ticket.isPublic),
						"withFriends" -> toJson(ticket.withFriends)
					)
				)
			})
		))
	)
}

とすると、

{
    "tickets": [
        [
            {
                "artist": "高垣彩陽", 
                "comment": "", 
                "id": 1, 
                "isEnd": false, 
                "isPublic": false, 
                "livedate": 1366988400000, 
                "livename": "ソロコンサートツアー", 
                "place": "栃木", 
                "registrydate": 1365951600000, 
                "rest": 3, 
                "username": "FScoward", 
                "withFriends": ""
            }, 
            {
                "artist": "高垣彩陽", 
                "comment": "", 
                "id": 2, 
                "isEnd": false, 
                "isPublic": true, 
                "livedate": 1368284400000, 
                "livename": "ソロコンサートツアー", 
                "place": "愛知", 
                "registrydate": 1368284400000, 
                "rest": 1, 
                "username": "FScoward", 
                "withFriends": ""
            }
        ]
    ]
}

のように返ってきます
一見良さそうに見えますが、よくよく見ると
"tickets" : [
の後に余分に [ が入ってます

ちゃんとお手本通り(http://www.playframework-ja.org/documentation/2.0.2/ScalaJson)にやってるのになんでだろうと考えましたが
たぶん
list.map
もJson形式の出力指定の一部として捉えらたためかと思います

じゃあどうしようと考えて試行錯誤した結果
list.map 直前の Seq を取ってやればうまくいくことがわかりました

def ticketToJson(list: List[models.Ticket]) = {
	Json.toJson(
		Map("tickets" -> 
			list.map(ticket => {
				toJson(
					Map(
						"id" -> toJson(ticket.id.get),
						"username" -> toJson(ticket.username),
						"artist" -> toJson(ticket.artist),
						"livename" -> toJson(ticket.livename),
						"rest" -> toJson(ticket.rest),
						"livedate" -> toJson(ticket.livedate),
						"isEnd" -> toJson(ticket.isEnd),
						"registrydate" -> toJson(ticket.registrydate),
						"place" -> toJson(ticket.place),
						"comment" -> toJson(ticket.comment),
						"isPublic" -> toJson(ticket.isPublic),
						"withFriends" -> toJson(ticket.withFriends)
					)
				)
			})
		)
	)
}

で、返ってくる結果が

{
    "tickets": [
        {
            "artist": "高垣彩陽", 
            "comment": "", 
            "id": 1, 
            "isEnd": false, 
            "isPublic": false, 
            "livedate": 1366988400000, 
            "livename": "ソロコンサートツアー", 
            "place": "栃木", 
            "registrydate": 1365951600000, 
            "rest": 3, 
            "username": "FScoward", 
            "withFriends": ""
        }, 
        {
            "artist": "高垣彩陽", 
            "comment": "", 
            "id": 2, 
            "isEnd": false, 
            "isPublic": true, 
            "livedate": 1368284400000, 
            "livename": "ソロコンサートツアー", 
            "place": "愛知", 
            "registrydate": 1368284400000, 
            "rest": 1, 
            "username": "FScoward", 
            "withFriends": ""
        }
    ]
}

上手くいきました

Scala逆引きレシピ (PROGRAMMER’S RECiPE)

Scala逆引きレシピ (PROGRAMMER’S RECiPE)