prosource

Play Framework - JSON 개체에 필드 추가

probook 2023. 2. 22. 22:19
반응형

Play Framework - JSON 개체에 필드 추가

Scala를 사용하여 Play Framework의 Json 개체에 필드를 추가하는 데 문제가 있습니다.

데이터를 포함하는 사례 클래스가 있습니다.예를 들어 다음과 같습니다.

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

Json Writes를 사용하여 Json 개체를 만들 수 있습니다.

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

Json은 다음과 같이 됩니다.

{ a:1, b:2 }

Json 개체에 'c' 필드를 추가한다고 가정합니다.결과:

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

새로운 케이스 클래스를 만들거나 Json.obj를 사용하여 직접 Json 개체를 만들지 않고 어떻게 하면 됩니까?다음과 같은 것을 찾고 있습니다.

jsonObject.merge({c:3}) 

아무쪼록 잘 부탁드립니다!

JsObject가 있다+오브젝트에 필드를 추가할 수 있는 메서드입니다만, 유감스럽게도jsonObject스태틱하게 입력됩니다.JsValue, 가 아닙니다.JsObject몇 가지 방법으로 이 문제를 해결할 수 있습니다.첫 번째 방법은as:

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

와 함께as당신은 기본적으로 다운캐스팅을 하고 있습니다.컴파일러에게 이렇게 말하는 겁니다.JsValue하지만 날 믿어, 이건 또한JsObject이 경우 안전하지만 좋은 생각은 아닙니다.보다 원칙적인 접근법은,OWrites직접:

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}

어쩌면 언젠가는Json오브젝트는toJsonObject필요한 방법OWrites인스턴스(instance)와 이 지나치게 명확한 접근 방식은 필요하지 않습니다.

나 스스로 해결책을 찾았다.실제로 Json.toJson의 반환 유형인 JsValue에는 이러한 메서드가 없지만 JsObject(http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.JsObject)에는 있기 때문에 솔루션은 다음과 같습니다.

val jsonObject = Json.toJson(classAObject).as[JsObject]
jsonObject + ("c", JsNumber(3)) 

누군가가 이것을 유용하게 생각해 주었으면 한다:)

간단한 방법은 argoanut(http://argonaut.io/)을 사용하는 것입니다.

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

여기서obj1.asJsonJSON 오브젝트를 만들고obj2에 의해 생성되는 json에 추가하는 오브젝트입니다.obj1.asJson

언급URL : https://stackoverflow.com/questions/22855710/play-framework-add-a-field-to-json-object

반응형