2014-01-08 33 views
0

我给js1作为一个字符串。 我想在“abc”下嵌套“a”,“b”,“c”。 我觉得这可以做几行代码。什么是更好的方式来做到这一点?什么是在Scala电梯JValue中改造的更好方法?

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

的最简单的方法是使用一个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] 
+0

我给整个js1作为字符串tho。 –

+0

我必须删除顶层a,b,c,并包含d,e,f,g。它不能只是a,b,c –

相关问题