繁体   English   中英

使用Scala解析/序列化JSON

[英]Parsing/serializing JSON with Scala

在Scala中,如何解序列化JSON字符串,修改值并序列化回字符串?

必须有一种无需使用第三方库即可执行此操作的方法,但我无法使其正常工作。 这是我到目前为止尝试过的:

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)}

如果标准Scala无法做到这一点,我将感谢并举例说明如何使用第三方库。

谢谢,

/大卫

我提到的小愚蠢/琐碎的例子。 也可以写得更好,但是想把它分成几部分。 您可以对他们做很多事情:

就播放版本而言,这是旧的链接,但据我所知,有关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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM