0

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)    

ルームリストは次のとおりです。

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"
})
4

2 に答える 2

3

そうです、scala/pickling で特定のコレクション タイプのオブジェクトを処理する際に問題が発生した時期があったことは間違いありません。ただし、これはしばらくの間修正されていることに注意してください。

与えられた:

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

そしてRoomListrl例えば、

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

REPL では、次のようになります。

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"
    }
    ]
  }
})

REPL をチェックインして、pickled/unpickled バージョンと元のバージョンの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

于 2013-09-11T17:01:01.773 に答える
0

「非プリミティブ型のコレクションはサポートされていません」(まだ)

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

私が見る限りscala.pickling、エッジの周りはまだ非常に粗いです。

さらに、デフォルトのピクル形式JSONPickleFormatにはいくつかのメタデータ (tpeフィールド) が必要であり、任意の JSON オブジェクトを解析することはないと思います。

于 2013-08-01T12:50:04.910 に答える