All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.andyglow.json.ParseJson.scala Maven / Gradle / Ivy

package com.github.andyglow.json

import java.io.{ByteArrayInputStream, InputStream}

import scala.collection.mutable
import scala.util.Try

object ParseJson {

  def apply(x: String): Try[Value] = apply(new ByteArrayInputStream(x.getBytes))

  def apply(x: InputStream): Try[Value] = Try {
    var root: MutableValue  = null
    var currentName: String = null
    val stack               = mutable.Stack[MutableValue]()

    def handleValue(v: MutableValue): Unit = {
      if (root == null) root = v
      stack.headOption foreach {
        case arr: MutableValue.arr                        => arr += v
        case obj: MutableValue.obj if currentName != null => obj.update(currentName, v)
        case _                                            =>
      }
    }

    val handler = new JsonHandler {

      override def start(): Unit = {}

      override def end(): Unit = {}

      override def objectStart(): Unit = {
        val o = MutableValue.obj()
        if (root == null) root = o
        handleValue(o)
        stack.push(o)
        currentName = null
      }

      override def objectEnd(): Unit = {
        stack.pop()
        currentName = null
      }

      override def arrayStart(): Unit = {
        val a = MutableValue.arr()
        if (root == null) root = a
        handleValue(a)
        stack.push(a)
        currentName = null
      }

      override def arrayEnd(): Unit = {
        stack.pop()
        currentName = null
      }

      override def name(name: String): Unit = {
        currentName = name
      }

      override def value(value: String): Unit = {
        handleValue(MutableValue.str(value))
        currentName = null
      }

      override def value(value: Int): Unit = {
        handleValue(MutableValue.int(value))
        currentName = null
      }

      override def value(value: Long): Unit = {
        handleValue(MutableValue.int(value))
        currentName = null
      }

      override def value(value: java.math.BigInteger): Unit = {
        handleValue(MutableValue.int(value))
        currentName = null
      }

      override def value(value: java.math.BigDecimal): Unit = {
        handleValue(MutableValue.dec(value))
        currentName = null
      }

      override def value(value: Boolean): Unit = {
        handleValue(MutableValue.bool(value))
        currentName = null
      }

      override def nullValue(): Unit = {
        handleValue(MutableValue.`null`)
        currentName = null
      }
    }

    val parser = new JsonParser(x, handler)
    parser.parse()

    if (root == null) throw new JsonParseException()
    root.toValue
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy