在Scala中格式化JSON字符串

6

你是否知道在Scala中格式化JSON字符串的简单方法?

我有一个如下所示的JSON字符串:

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

我可以使用一个函数f,使得:

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

我知道我在回答中所做的格式可能不完美,但你已经明白了要点。是的,不使用Play框架也可以完成吗?

2个回答

9

如果您正在使用Play Framework,您可以使用Json.prettyPrint方法来格式化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"
//     }
//   }
// }

如果您使用scala.util.parsing.json,则需要自行创建此方法。例如:

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"
// }

请注意,这并不是一个高效的实现。

3

我记得在某个地方看到Typesafe正在考虑将其JSON处理从Play中分离出来,所以首先要了解这一点,以应用@senia的解决方案。

否则,请查看Jackson - 或更准确地说,Jackson的Scala包装器

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

我还听说孩子们对Scala Pickling很感兴趣,这个应该也有漂亮的打印功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接