Skip to content

Instantly share code, notes, and snippets.

@mashijp
Created May 28, 2015 14:24
Show Gist options
  • Save mashijp/be702a928dd4a5e77399 to your computer and use it in GitHub Desktop.
Save mashijp/be702a928dd4a5e77399 to your computer and use it in GitHub Desktop.
Scala パーサーコンビネータ で 適当JSONリード
import scala.util.parsing.combinator.JavaTokenParsers
sealed trait JsValue
case class JsString(value: String) extends JsValue
case class JsNumber(value: BigDecimal) extends JsValue
case object JsNull extends JsValue
case class JsBoolean(value: Boolean) extends JsValue
case class JsArray(value: Seq[JsValue]) extends JsValue
case class JsObject(value: Map[JsKey, JsValue]) extends JsValue
case class JsKey(key: String)
class JsonParser extends JavaTokenParsers {
def jsString: Parser[JsString] = stringLiteral ^^ {x => JsString(x)}
def jsBoolean: Parser[JsBoolean] = ("false" ^^ {x => JsBoolean(false)} | "true" ^^ {x => JsBoolean(true)})
def jsNull: Parser[JsNull.type] = "null" ^^ {_ => JsNull}
def jsNumber: Parser[JsNumber] = floatingPointNumber ^^ {x => JsNumber(BigDecimal(x))}
def array: Parser[JsArray] = "["~>repsep(value, ",")<~"]" ^^ {JsArray}
def obj: Parser[JsObject] = "{"~>repsep(member, ",")<~"}" ^^ { x =>
JsObject(x.toMap)
}
def value: Parser[JsValue] = jsNumber | jsString | array | obj | jsNull | jsBoolean
def member: Parser[(JsKey, JsValue)] = stringLiteral~":"~value ^^ {
case key~":"~value => JsKey(key) -> value
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment