2014-04-04 17 views
29

alan eklemek:Çal Çerçeve - Scala kullanarak Play Çerçevesi Json nesnesine bir alan ekleyerek bir sorun var JSON nesnesi

Ben verileri içeren bir vaka sınıf var. Örneğin:

val classAObject = ClassA(1,2) 
implicit val classAWrites= Json.writes[ClassA] 
val jsonObject = Json.toJson(classAObject) 

ve Json gibi görünecektir:

case class ClassA(a:Int,b:Int) 

ve ben Json kullanarak Json nesnesi oluşturmak mümkün duyuyorum yazar en İsterim varsayalım

{ a:1, b:2 } 

Json nesnesine ek bir 'c' alanı ekleyin. Sonuç:

{ a:1, b:2, c:3 } 

nasıl Ben yapmak, yeni bir vaka sınıfını oluşturarak veya benim Json Json.obj kullanarak kendim nesne yaratmadan? Ben bir şey gibi arıyorum:

jsonObject.merge({c:3}) 

Herhangi bir yardım takdir!

cevap

31

JsObject, bir nesneyi alanlar eklemenize izin veren bir + yöntemine sahiptir, ancak ne yazık ki jsonObject, JsObject değil, JsValue olarak statik olarak yazılmıştır. Bunu birkaç şekilde alabilirsiniz. İlk as kullanmaktır: as ile

scala> jsonObject.as[JsObject] + ("c" -> Json.toJson(3)) 
res0: play.api.libs.json.JsObject = {"a":1,"b":2,"c":3} 

aslında ediyoruz downcasting şundan derleyici, anlatarak "keşke beni bu JsValue olduğunu biliyoruz, ama inan, o da bir JsObject var". Bu durumda bu güvenlidir, ama bu iyi bir fikir değildir. Daha ilkeli bir yaklaşım doğrudan OWrites kullanmaktır:

scala> val jsonObject = classAWrites.writes(classAObject) 
jsonObject: play.api.libs.json.JsObject = {"a":1,"b":2} 

scala> jsonObject + ("c" -> Json.toJson(3)) 
res1: play.api.libs.json.JsObject = {"a":1,"b":2,"c":3} 

Belki bir gün Json nesne gerekli olmayacak bir OWrites örneği ve bu aşırı açık bir yaklaşım gerektirmektedir bir toJsonObject yöntemine sahip olacaktır.

+0

yarattığı json eklenecek nesnedir bir JSON nesnesi oluşturur kullanmaktır, 'yazar. yazıyor 'JsValue' döndürür, bu yüzden (REPL değil) upcasting kurtulmak nasıl anlayamıyorum. – Tvaroh

+0

Tvaroh haklı, JsValue'yi görebildiğim kadarıyla – elmalto

+2

@elmalto deneyin. Bunu deneyin; —classAWrites' statik olarak "OWrites [ClassA]" (hem Play 2.2 hem de 2.3 ve 2.10 ve 2.11'de) olarak yazılacaktır. Bunun nedeni Scala'nın makrolarının "belirtilmiş fakat amaçlanan" davranışından kaynaklanmaktadır (benim soruma [burada] bakınız (http: // stackoverflow).com/q/13669974/334519) detaylar için). –

-1

basit bir yolu argoanut (http://argonaut.io/) burada obj1.asJson

var jField : Json.JsonField = "myfield" //Json.JsonField is of type String 
obj1.asJson.->:(jField, obj2.asJson) // adds a field to obj1.asJson 

ve obj2 imza Başına obj1.asJson

İlgili konular