src/Pure/General/json.scala
author wenzelm
Sat, 10 Dec 2016 17:20:39 +0100
changeset 64545 25045094d7bb
parent 63992 3aa9837d05c7
child 64761 ae97a5afffcc
permissions -rw-r--r--
clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63992
3aa9837d05c7 updated headers;
wenzelm
parents: 63644
diff changeset
     1
/*  Title:      Pure/General/json.scala
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     3
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     4
Support for JSON parsing.
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     5
*/
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     6
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     7
package isabelle
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     8
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
     9
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    10
import scala.util.parsing.json.{JSONObject, JSONArray}
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    11
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
    12
object JSON
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
    13
{
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    14
  type T = Any
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    15
  type S = String
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
    16
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
    17
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    18
  /* standard format */
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    19
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    20
  def parse(s: S): T = Format.unapply(s) getOrElse error("Malformed JSON")
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    21
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    22
  object Format
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    23
  {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    24
    def unapply(s: S): Option[T] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    25
      try { scala.util.parsing.json.JSON.parseFull(s) }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    26
      catch { case ERROR(_) => None }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    27
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    28
    def apply(json: T): S =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    29
    {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    30
      val result = new StringBuilder
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    31
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    32
      def string(s: String)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    33
      {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    34
        result += '"'
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    35
        result ++= scala.util.parsing.json.JSONFormat.quoteString(s)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    36
        result += '"'
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    37
      }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    38
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    39
      def array(list: List[T])
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    40
      {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    41
        result += '['
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    42
        Library.separate(None, list.map(Some(_))).foreach({
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    43
          case None => result += ','
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    44
          case Some(x) => json_format(x)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    45
        })
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    46
        result += ']'
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    47
      }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    48
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    49
      def object_(obj: Map[String, T])
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    50
      {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    51
        result += '{'
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    52
        Library.separate(None, obj.toList.map(Some(_))).foreach({
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    53
          case None => result += ','
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    54
          case Some((x, y)) =>
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    55
            string(x)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    56
            result += ':'
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    57
            json_format(y)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    58
        })
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    59
        result += '}'
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    60
      }
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
    61
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    62
      def json_format(x: T)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    63
      {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    64
        x match {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    65
          case null => result ++= "null"
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    66
          case _: Int | _: Long | _: Boolean => result ++= x.toString
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    67
          case n: Double =>
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    68
            val i = n.toLong
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    69
            result ++= (if (i.toDouble == n) i.toString else n.toString)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    70
          case s: String => string(s)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    71
          case JSONObject(obj) => object_(obj)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    72
          case obj: Map[_, _] if obj.keySet.forall(_.isInstanceOf[String]) =>
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    73
            object_(obj.asInstanceOf[Map[String, T]])
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    74
          case JSONArray(list) => array(list)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    75
          case list: List[T] => array(list)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    76
          case _ => error("Bad JSON value: " + x.toString)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    77
        }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    78
      }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    79
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    80
      json_format(json)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    81
      result.toString
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    82
    }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    83
  }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    84
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    85
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    86
  /* numbers */
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    87
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    88
  object Number
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    89
  {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    90
    object Double {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    91
      def unapply(json: T): Option[scala.Double] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    92
        json match {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    93
          case x: scala.Double => Some(x)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    94
          case x: scala.Long => Some(x.toDouble)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    95
          case x: scala.Int => Some(x.toDouble)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    96
          case _ => None
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    97
        }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    98
    }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
    99
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   100
    object Long {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   101
      def unapply(json: T): Option[scala.Long] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   102
        json match {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   103
          case x: scala.Double if x.toLong.toDouble == x => Some(x.toLong)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   104
          case x: scala.Long => Some(x)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   105
          case x: scala.Int => Some(x.toLong)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   106
          case _ => None
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   107
        }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   108
    }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   109
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   110
    object Int {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   111
      def unapply(json: T): Option[scala.Int] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   112
        json match {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   113
          case x: scala.Double if x.toInt.toDouble == x => Some(x.toInt)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   114
          case x: scala.Long if x.toInt.toLong == x => Some(x.toInt)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   115
          case x: scala.Int => Some(x)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   116
          case _ => None
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   117
        }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   118
    }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   119
  }
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   120
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   121
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   122
  /* object values */
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   123
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   124
  def value(obj: T, name: String): Option[T] =
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   125
    obj match {
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   126
      case m: Map[_, _] if m.keySet.forall(_.isInstanceOf[String]) =>
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   127
        m.asInstanceOf[Map[String, T]].get(name)
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   128
      case _ => None
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   129
    }
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   130
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   131
  def value[A](obj: T, name: String, unapply: T => Option[A]): Option[A] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   132
    for {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   133
      json <- value(obj, name)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   134
      x <- unapply(json)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   135
    } yield x
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   136
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   137
  def array(obj: T, name: String): Option[List[T]] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   138
    value(obj, name) match {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   139
      case Some(a: List[T]) => Some(a)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   140
      case _ => None
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   141
    }
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   142
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   143
  def array[A](obj: T, name: String, unapply: T => Option[A]): Option[List[A]] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   144
    for {
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   145
      a0 <- array(obj, name)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   146
      a = a0.map(unapply(_))
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   147
      if a.forall(_.isDefined)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   148
    } yield a.map(_.get)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   149
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   150
  def string(obj: T, name: String): Option[String] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   151
    value(obj, name) match {
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   152
      case Some(x: String) => Some(x)
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   153
      case _ => None
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   154
    }
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   155
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   156
  def double(obj: T, name: String): Option[Double] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   157
    value(obj, name, Number.Double.unapply)
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   158
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   159
  def long(obj: T, name: String): Option[Long] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   160
    value(obj, name, Number.Long.unapply)
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   161
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   162
  def int(obj: T, name: String): Option[Int] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   163
    value(obj, name, Number.Int.unapply)
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   164
64545
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   165
  def bool(obj: T, name: String): Option[Boolean] =
25045094d7bb clarified JSON operations (see isabelle_vscode/a7931dc2a1ab);
wenzelm
parents: 63992
diff changeset
   166
    value(obj, name) match {
63644
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   167
      case Some(x: Boolean) => Some(x)
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   168
      case _ => None
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   169
    }
ed266398da33 support for JSON parsing;
wenzelm
parents:
diff changeset
   170
}