2015-02-09 4 views
0

В Scala, как я могу де-сериализовать строку 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)} 

Если это не возможно, со стандартным Scala, я ценю и пример того, как сделать это с помощью сторонней библиотеки.

Спасибо,

/David

+1

Возможный дубликат http://stackoverflow.com/questions/4170949/how-to-parse-json-in-scala-using-standard-scala-classes, хотя в настоящее время анализатор JSON с комбинаторами парсеров, кажется, устарел (слишком медленный, неподдерживаемый). Ищите альтернативы: http://softwarerecs.s.stackexchange.com/. –

+5

Есть много JSON-библиотек (например, Argonaut, Play-Json, Lift-Json, ...) – cchantep

+0

Я использовал https://github.com/json4s/json4s с некоторым успехом. У этого есть хороший API. –

ответ

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) 
Смежные вопросы