Работа с серализированными данными#

JSON#

JObject#

Представляет собой обертку над мапой ключ-значение Отлично подходит для небольших объектов ключ-значение и для больших объектов без конкретной структуры

Способы получения#

val fromStr = "".ns.toJValue.asJObject
val fromRop = JEmbeddedDoc.parseProperty(rop, "Имя json контейнера").asJObject

Геттеры#

  • Для получения данных из контейнера по ключу используйте один из типизированных геттеров ru.bitec.app.gtk.lang.json.JObjectAbs:

    val jObj = JEmbeddedDoc.parseProperty(rop,"Имя json контейнера").asJObject
    jObj.getNString(key)
    jObj.getBoolean(key)
    jObj.getNLong(key)
    jObj.getNDate(key)
    jObj.getNGid(key)
    jObj.childJObject(key)
    jObj.childJArray(key)
    
    /** Общий гетер
    * ВАЖНО: JArray и JObject полученные через этот метод являются копиями т.е. изменеия в них не отобразятся в ориг. объекте
    */
    jObj.getJValue(key: NString)
    
  • Для записи в контейнер используйте типизированные сеттеры ru.bitec.app.gtk.lang.json.JObjectAbs:

      val jObj = "{}".ns.toJValue.asJObject
      jObj.set("key".ns, value)
      val innerJArray = jObj.createJArray("array".ns)
      val innerJObject = jObj.createJObject("object".ns)
    

Object Mapper#

Конвертирует JSON строку в конкретные объекты

Cериализация и десериализация#

        val jsonString = """{"key":{"id":10,"value":"someValue"}}"""
        /** ВАЖНО все классы используемые для десериализации должны
         * быть объявлены вне других классов
         */
        case class Example(id: NLong, value: NString)

        val map = GtkObjectMapper().readValue[Map[NString, Example]](jsonString)

        val newJsonString = GtkObjectMapper().writeValueAsString(map)

Cериализация и десериализация абстрактных типов#

  // При сериализации наследников им добавится ключ "type"
@JsonTypeInfo(
  use = JsonTypeInfo.Id.NAME,
  include = As.PROPERTY,
  property = "type")
@JsonSubTypes(
  value = Array(
    new JsonSubTypes.Type(value = classOf[Type1], name = "type1"),
    new JsonSubTypes.Type(value = classOf[Type2], name = "type2")
  )
)
trait Base {
  def id: NLong

  def sValue: NString
}

@JsonTypeName("type1")
case class Type1(id: NLong, sValue: NString, nValue: NNumber) extends Base

@JsonTypeName("type2")
case class Type2(id: NLong, sValue: NString, gidValue: NGid) extends Base

val sJSON ="""{
  "id": 10,
  "sValue": "Hello world",
  "type": "type2",
  "gidValue": "0/0"
}"""

val result  = GtkObjectMapper().readValue[Base](sJSON) match {
  case Type1(id, sValue, nValue) => nValue.toString()
  case Type2(id, sValue, gidValue) => gidValue.toString
}