Format JSON string in scala

前端 未结 2 791
盖世英雄少女心
盖世英雄少女心 2020-12-19 11:57

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


        
相关标签:
2条回答
  • 2020-12-19 12:39

    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.

    0 讨论(0)
  • 2020-12-19 12:42

    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.

    0 讨论(0)
提交回复
热议问题