2017-04-11 52 views
2

我上面下面的對象,我使用瑟茜如何序列化Scala的對象爲JSON已經包含一些Json的

case class Person(name: String, data: String) 
val x = Person("test", s"""{"a": 10, "b":"foo"}""") 
import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._ 
println(x.asJson) 

語句的輸出序列化到JSON是

{ 
    "name" : "test", 
    "data" : "{\"a\":10, \"b\":\"foo\"}" 
} 

但我想要的輸出是

{ 
    "name": "test", 
    "data": { 
     "a": 10, 
     "b": "foo" 
    } 
} 

我從基於json的數據獲取數據字段的數據st礦石。我想通過它(所以我不想將它解組成一個scala對象,只是把它再次解壓縮成json。那個marshall/demarshall是我的服務器上的CPU的浪費。 ?處理此類數據

+0

你能舉一個你想要最終JSON的例子嗎? – puhlen

+0

我在我的問題中添加了示例。 –

回答

3

好了,你可以寫自己的Encoder實現,如:

import io.circe.{Encoder, Json} 
import io.circe.jawn.parse 

case class Person(name: String, data: String) 

implicit val personEncoder: Encoder[Person] = new Encoder[Person] { 
    override def apply(person: Person): Json = { 
    val name = Json.fromString(person.name) 
    val data = parse(person.data) match { 
     case Left(_)  => Json.obj() 
     case Right(value) => value 
    } 
    Json.obj("name" -> name, "data" -> data) 
    } 
} 

由於這一事實的事情,你必須非常不尋常的情況下 - 中的一個字段是一個String,你需要解析之前,你把它作爲一個孩子的JSON節點。錯誤失敗需要處理某種方式 - 我用空的對象,但這不是必需的ily你想用什麼。

如果您想省略反序列化步驟......這是不可能的。您正在構建具有定義行爲的JSON節點樹。字符串不能像對待Json那樣突然被處理。