Skip to content

Instantly share code, notes, and snippets.

@asmuth
Created April 25, 2012 21:18
Show Gist options
  • Save asmuth/2493537 to your computer and use it in GitHub Desktop.
Save asmuth/2493537 to your computer and use it in GitHub Desktop.
simple (uber-hacky) json renderer in 40 lines of scala
import scala.collection.immutable.Map
/*
simple (uber-hacky) json renderer in 40 lines of scala
http://github.com/paulasmuth
usage:
JSONRenderer.render(Map(
"a_string" -> "fnord",
"an_array" -> List(1,2,3),
"2nd_level" -> Map("fu" -> "bar")
)).toString
output:
{
"a_string": "fnord",
"an_array": [ 1, 2, 3 ],
"2nd_level": { "fu": "bar" }
}
*/
object JSONRenderer{
class JSONObject(raw: String){
override def toString() = raw
}
def render(in: Any) : String = { in match {
case str: String => render_string(str)
case lst: List[Any] => render_list(lst)
case int: Integer => render_num(int.toLong)
case lng: Long => render_num(lng)
case obj: JSONObject => obj.toString
case obj: Map[String, Any] => render_obj(obj).toString
}}
def render_obj(src: Map[String, Any]) : JSONObject =
new JSONObject("{ " + (render_values(src) reduceLeft (
(s: String, c: String) => s + ", " + c )) + " }")
private def render_values(src: Map[String, Any]) : List[String] =
(src toList) map (
(c: (String, Any)) =>
render_string(c._1) + ": " + render(c._2).toString)
private def render_string(str: String) : String =
"\"" + str.replaceAll("\"", "\\\\\"") + "\""
private def render_list(lst: List[Any]) : String =
(("[ " /: lst.view.zipWithIndex)(
(s: String, c: (Any, Int)) =>
s + render(c._1) + (
if (c._2 < lst.size - 1) ", " else "")) + " ]")
private def render_num(num: Long) : String = num.toString
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment