복붙노트

[SCALA] 프레임 워크를 재생 - JSON 객체에 필드를 추가

SCALA

프레임 워크를 재생 - JSON 객체에 필드를 추가

나는 스칼라를 사용하여 플레이 프레임 워크에 JSON 객체에 필드를 추가에 문제가 :

나는 데이터를 포함하는 경우 클래스가 있습니다. 예를 들면 :

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

내가 JSON의 쓰기를 사용하여 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}) 

어떤 도움에 감사드립니다!

해결법

  1. ==============================

    1.JSObject를 사용하면 객체에 필드를 추가 할 수있는 + 방법이 있지만, 불행히도 된 JSONObject는 정적 JsValue 아닌의 JSObject으로 입력됩니다. 당신은 몇 가지 방법이 주위를 얻을 수 있습니다. 첫 번째로 사용하는 것입니다 :

    JSObject를 사용하면 객체에 필드를 추가 할 수있는 + 방법이 있지만, 불행히도 된 JSONObject는 정적 JsValue 아닌의 JSObject으로 입력됩니다. 당신은 몇 가지 방법이 주위를 얻을 수 있습니다. 첫 번째로 사용하는 것입니다 :

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

    당신은 본질적으로 downcasting - 멋져요가있는 것처럼 컴파일러를 이야기로, "당신은 단지, 그것도의 JSObject의 날이이 JsValue 것을 알고 있지만 생각". 이것은이 경우에는 안전하지만, 그것은 좋은 생각이 아니다. 더 원칙적인 접근 방식은 직접 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 객체는 필요하지 않을 것입니다 OWrites 인스턴스이 지나치게 명시 적 접근 방식을 필요로하는 toJsonObject 방법이있을 것이다.

  2. ==============================

    2.나는 해결책을 찾아 냈다. 사실 Json.toJson의 리턴 타입이 이러한 방법이 없다이다 JsValue,하지만의 JSObject (http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api 이 솔루션은 그래서 .libs.json.JsObject)는 않습니다 :

    나는 해결책을 찾아 냈다. 사실 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)) 
    

    나는 누군가가이 유용 바랍니다 :)

  3. ==============================

    3.간단한 방법이 사용 argoanut이다 (http://argonaut.io/)

    간단한 방법이 사용 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.asJson는 JSON 객체를 생성 상기 개체에 의해 생성 된 obj1.asJson JSON에 추가 될 것이다 obj2보다

  4. from https://stackoverflow.com/questions/22855710/play-framework-add-a-field-to-json-object by cc-by-sa and MIT license