2015-02-09 61 views
0

在斯卡拉序列化JSON,我怎么能去序列化JSON字符串,修改值和序列化回字符串?解析/使用Scala

必须有一个办法做到这一点,而无需使用第三方库,但我无法得到它的工作。以下是我试过到目前为止:

import scala.util.parsing.json 

var lines = "{\"id\" : \"abc\", \"stuff\" : [1, 2, 3], \"more\" : {\"bro\" : \"science\"}}" 

// Test 1 
val myJSON = json.JSON.parseRaw(lines) 
// myJSON: Option[scala.util.parsing.json.JSONType] = Some({"id" : "abc", "stuff" : [1.0, 2.0, 3.0], "more" : {"bro" : "science"}}) 
// I cannot modify fields on the JSONType instance but toString() works well. 
// res1: String = Some({"id" : "abc", "stuff" : [1.0, 2.0, 3.0], "more" : {"bro" : "science"}}) 

// Test 2 
// This way I can parse JSON into a map and manipulate its values. 
// val myMap = json.JSON.parseFull(lines).get.asInstanceOf[Map[String, Any]] + ("id" -> "blah") 
// myMap: scala.collection.immutable.Map[String,Any] = Map(id -> blah, stuff -> List(1.0, 2.0, 3.0), more -> Map(bro -> science)) 

// However, when converted to an instance of JSONObject and calling 
// toString() only the top-level items are JSON-serialized 
new json.JSONObject(myMap).toString() 
// res2: String = {"id" : "blah", "stuff" : List(1.0, 2.0, 3.0), "more" : Map(bro -> science)} 

如果它不可能与标准斯卡拉,我会很感激,并举例如何与第三方库做到这一点。

感谢,

/大卫

+1

http://stackoverflow.com/questions/4170949/how-to-parse-json-in-scala-using-standard-scala-classes的可能的复制,虽然时下JSON解析器与解析器组合似乎被弃用(太缓慢,无人维持)。寻找替代品:http://softwarerecs.stackexchange.com/。 – 2015-02-09 12:24:39

+5

有许多JSON库(例如淘金者,玩,JSON,电梯,JSON,...) – cchantep 2015-02-09 12:41:47

+0

我一直使用https://github.com/json4s/json4s取得了一些成功。它有一个很好的API。 – 2015-02-09 14:06:12

回答

1

小傻/琐碎的什么我提到的例子。可以写得更好,但想把它分成块。有很多,你可以与他们无关:

这是在打版方面旧的链接,但据我所知,最新在2.3.x版本提供的功能:

https://www.playframework.com/documentation/2.1.1/ScalaJsonTransformers

import play.api.libs.json._ 

var lines = "{\"id\" : \"abc\", \"stuff\" : [1, 2, 3], \"more\" : {\"bro\" :  \"science\"}}" 

val jsonAsJsValue = Json.parse(lines) 
//jsonAsJsValue: play.api.libs.json.JsValue = {"id":"abc","stuff": [1,2,3],"more":{"bro":"science"}} 
val updateIdTransformer = (__ \"id").json.update(
__.read[JsString].map{a => JsString("def")} 
) 

val updatedJson = jsonAsJsValue.transform(updateIdTransformer) 

//updatedJson: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"id":"def","stuff":[1,2,3],"more":{"bro":"science"}},/id)