2013-03-01 4 views
1

У меня есть следующий код:Как преобразовать анонимный класс в json?

def test = Action { 
    val Anon = new { 
    val foo = "foo" 
    val bar = "bar" 
    } 

    Ok(Json.toJson(Anon)) 
} 

И я получаю эту ошибку компиляции:

No Json deserializer found for type Object{val foo: String; val bar: String}. Try to implement an implicit Writes or Format for this type.

Что такое быстрое решение этой проблемы? Я уже нашел здесь другой вопрос, связанный с этой ошибкой, но, возможно, он был более конкретным/сложным.

+0

без отражения, я не вижу, как это сделать ... –

+0

@JulienLafont - кто что-то сказал без размышлений? Но я бы не хотел сам писать код, но для этого нужно использовать однострочный. – ripper234

+0

С размышлением, я не думаю, что кто-то уже это сделал. Попробуйте создать имя карты/значения с помощью Anon.getClass.getDeclaredFields, например. –

ответ

1

Насколько я могу сказать, единственный способ ввести структурный тип:

type AnonType = { 
    def foo:String 
    def bar:String 
    } 

Тогда вы можете либо сделать

implicit val writeAnon1 = 
    ((__ \ "foo").write[String] and 
    (__ \ "bar").write[String]) 
    {anon:AnonType => (anon.foo, anon.bar)} 

или

implicit val writeAnon2 = new Writes[AnonType] { 
    def writes(o:AnonType) = 
    Json toJson Map(
     "foo" -> o.foo, 
     "bar" -> o.bar) 
}