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

eu.inn.binders.json.JsonSerializer.scala Maven / Gradle / Ivy

package eu.inn.binders.json

import java.util.Date

import com.fasterxml.jackson.core.JsonGenerator
import eu.inn.binders.core.Serializer
import eu.inn.binders.dynamic._
import eu.inn.binders.naming.Converter
import scala.language.experimental.macros

class JsonSerializeException(message: String) extends RuntimeException(message)

class JsonSerializerBase[C <: Converter, F <: Serializer[C]] protected (val jsonGenerator: JsonGenerator) extends Serializer[C]{

  def getFieldSerializer(fieldName: String): Option[F] = {
    jsonGenerator.writeFieldName(fieldName)
    Some(createFieldSerializer())
  }

  protected def createFieldSerializer(): F = ???

  def writeNull(): Unit = jsonGenerator.writeNull()
  def writeInteger(value: Int): Unit = jsonGenerator.writeNumber(value)
  def writeLong(value: Long): Unit = jsonGenerator.writeNumber(value)
  def writeString(value: String): Unit = jsonGenerator.writeString(value)
  def writeFloat(value: Float): Unit = jsonGenerator.writeNumber(value)
  def writeDouble(value: Double): Unit = jsonGenerator.writeNumber(value)
  def writeBoolean(value: Boolean): Unit = jsonGenerator.writeBoolean(value)
  def writeBigDecimal(value: BigDecimal): Unit = jsonGenerator.writeNumber(value.bigDecimal)
  def writeDate(value: Date): Unit = jsonGenerator.writeNumber(value.getTime)

  def beginObject(): Unit = {
    jsonGenerator.writeStartObject()
  }

  def endObject(): Unit = {
    jsonGenerator.writeEndObject()
  }

  def beginArray(): Unit = {
    jsonGenerator.writeStartArray()
  }
  def endArray(): Unit = {
    jsonGenerator.writeEndArray()
  }

  def writeValue(value: Value): Unit = {
    if (value == null)
      writeNull()
    else
      value.accept(new ValueVisitor[Unit] {
        override def visitNumber(d: Number) = writeBigDecimal(d.v)
        override def visitBool(d: Bool) = writeBoolean(d.v)
        override def visitObj(d: Obj) = {
          beginObject()
          d.v.foreach(kv => {
            getFieldSerializer(kv._1).get.asInstanceOf[JsonSerializerBase[_,_]].writeValue(kv._2)
          })
          endObject()
        }
        override def visitText(d: Text) = writeString(d.v)
        override def visitLst(d: Lst) = {
          beginArray()
          d.v.foreach(writeValue)
          endArray()
        }
        override def visitNull() = writeNull()
      })
  }
}

class JsonSerializer[C <: Converter](override val jsonGenerator: JsonGenerator) extends JsonSerializerBase[C, JsonSerializer[C]](jsonGenerator){
  protected override def createFieldSerializer(): JsonSerializer[C] = new JsonSerializer[C](jsonGenerator)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy