2013-07-04 3 views
0

Я пытаюсь преобразовать массив JSON объектов из ключа в массив объектов в Scala ...Синтаксический массив JSon объектов к объектам SCALA с травлением

Вот код:

case class RoomList(val rooms : Array[Room]) 
case class Room(val name : String) 

val json = "{\"rooms\" : [{\"name\" : \"Test\"}]}" 

println(json.unpickle[RoomList]) 

Вот исключение

Exception in thread "main" java.lang.InstantiationException: [Lhipchat.Room; 
    at sun.misc.Unsafe.allocateInstance(Native Method) 
    at hipchat.HipChat$HipchatRoomListUnpickler1$2$ScalaArray$u005BhipchatRoom$u005DUnpickler1$2$.unpickle(HipChat.scala:46) 
    at hipchat.HipChat$HipchatRoomListUnpickler1$2$.unpickle(HipChat.scala:46) 
    at hipchat.HipChat.getRooms(HipChat.scala:46) 
    at bot.Bot$.main(Bot.scala:11) 
    at bot.Bot.main(Bot.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)  

Вот является RoomList:

val room = new Room("test") 
val rooms = Array(room) 
val rl = new RoomList(rooms) 
println(rl.pickle) 

маринованный:

JSONPickle({ 
    "tpe": "hipchat.RoomList", 
    "rooms": { 

    } 
}) 

И маринованный номер:

JSONPickle({ 
    "tpe": "hipchat.Room", 
    "name": "test" 
}) 

ответ

0

"Коллекция непримитивных типов не поддерживается" (пока)

https://github.com/scala/pickling/issues/6

Из того, что я могу см., scala.pickling все еще очень грубо по краям.

Кроме того, по умолчанию формат травления JSONPickleFormat требует некоторых метаданных (поле tpe), и я предполагаю, что не будет разбирать произвольные объекты JSON.

3

Да, вы правы, что был период времени, когда у scala/pickling возникли проблемы с определенными типами коллекций предметов. Хотя, стоит отметить, что это было исправлено на некоторое время.

Дано:

case class Room(val name: String) 
case class RoomList(val rooms: Array[Room]) 

И некоторые RoomList, rl, например,

val rl = RoomList(Array(Room("foo"), Room("biz"), Room("bang"))) 

В РЕПЛ, вы получите:

scala> val p = rl.pickle 
p: scala.pickling.json.JSONPickle = 
JSONPickle({ 
    "tpe": "RoomList", 
    "rooms": { 
    "elems": [ 
     { 
     "tpe": "Room", 
     "name": "foo" 
    }, 
     { 
     "tpe": "Room", 
     "name": "biz" 
    }, 
     { 
     "tpe": "Room", 
     "name": "bang" 
    } 
    ] 
    } 
}) 

Мы можем проверить в РЕПЛ на убедитесь, что маринованная/неокрашенная версия и оригинальная версия rl имеют одни и те же элементы:

scala> rl.pickle.unpickle[RoomList].rooms.sameElements(rl.rooms) 
res0: Boolean = true 

Добавлено это в scala/pickling тестов, а также :) https://github.com/scala/pickling/blob/2.10.x/core/src/test/scala/pickling/roomlist-object-array.scala

Смежные вопросы