在Scala lift JValue中进行转换的更好方法是什么?

时间:2014-01-08 23:29:46

标签: scala lift lift-json

我将js1作为字符串给出。 我想在“a”下嵌套“b”,“c”,“abc”。 我觉得这可以做几行代码。下面有什么更好的方法呢?

val js1 = """
{
    "name" : "test",
    "a" : true,
    "b" : true,
    "c" : true,
    "d" : true,
    "f" : true,
    "g" : true,
    "h" : true,
}
""" 

val jsGroups = parse(js1)

val a = (jsGroups \ "a").values.toString.toBoolean
val b = (jsGroups \ "b").values.toString.toBoolean
val c = (jsGroups \ "c").values.toString.toBoolean
val abc = ("a" -> a) ~ ("b" -> b) ~ ("c" -> c)
val r = jsGroups.remove { x =>
  x match {
    case JField("a", bool) => true
    case JField("b", bool) => true
    case JField("c", bool) => true
    case _ => false
  }

}
val newJs = r.merge(JObject(List(JField("abc", abc))))
println(pretty(render(newJs)))

输出必须

{   “名”:“测试”,   “d”:真实,   “F”:真实,   “G”:真实,   “H”:真实,   “ABC”:{     “一”:真实,     “B”:真实,     “C”:真   } }

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用case class

import net.liftweb.json.{ DefaultFormats, Extraction, JsonParser } 
case class Abc(a: Boolean, b: Boolean, c: Boolean)
implicit val formats = DefaultFormats

// to serialize to JValue
val test = Abc(true, true, true)
Extraction.decompose(test)

// to parse from String
JsonParser.parse("""{a: true, b: true, c: true}""").extract[Abc]