Работа с серализированными данными
Contents
Работа с серализированными данными#
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
}