简体   繁体   中英

Format JSON string in scala

Is there a straight forward way to format a JSON string in scala?

I have a JSON String like this:

val json = {"foo": {"bar": {"baz": T}}}

Can I use a function f such that:

f(json) = {
           "foo": 
                {"bar": 
                       {"baz": T}
                }
           }

I know the formatting I have done in my answer is no perfect, but you get the point. And yes, can it be done without using Play Framework?

In case you are using Play Framework you could use Json.prettyPrint method to format JsValue :

import play.api.libs.json.Json

val str = """{"foo": {"bar": {"baz": "T"}}}"""

val jsValue = Json parse str
// JsValue = {"foo":{"bar":{"baz":"T"}}}

Json prettyPrint jsValue
// String = 
// {
//   "foo" : {
//     "bar" : {
//       "baz" : "T"
//     }
//   }
// }

In case you are using scala.util.parsing.json you have to create such method by yourself. For instance:

def format(t: Any, i: Int = 0): String = t match {
  case o: JSONObject =>
    o.obj.map{ case (k, v) =>
      "  "*(i+1) + JSONFormat.defaultFormatter(k) + ": " + format(v, i+1)
    }.mkString("{\n", ",\n", "\n" + "  "*i + "}")

  case a: JSONArray =>
    a.list.map{
      e => "  "*(i+1) + format(e, i+1)
    }.mkString("[\n", ",\n", "\n" + "  "*i + "]")

  case _ => JSONFormat defaultFormatter t
}

val jsn = JSON.parseRaw("""{"foo": {"bar": {"baz": "T"}, "arr": [1, 2, "x"]}, "foo2": "a"}""").get
// JSONType = {"foo" : {"bar" : {"baz" : "T"}, "arr" : [1.0, 2.0, "x"]}, "foo2" : "a"}

format(jsn)
// String = 
// {
//   "foo": {
//     "bar": {
//       "baz": "T"
//     },
//     "arr": [
//       1.0,
//       2.0,
//       "x"
//     ]
//   },
//   "foo2": "a"
// }

Note that this is not an efficient implementation.

I thought I read somewhere that Typesafe was considering separating their JSON processing out of Play, so look into that to apply @senia's solution first.

Otherwise, look at Jackson--or more precisely, the Scala wrapper for Jackson :

val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
val writer = mapper.writerWithDefaultPrettyPrinter
val json = writer.writeValueAsString(Object value)

I've also heard that the kids are really into Scala Pickling , which apparently has pretty printing as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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