2011-06-29 5 views
4

lift-jsonライブラリを使用してJSON-Stringを逆シリアル化する必要があります。私のAndroidアプリケーションでは、Scala 2.9.0とlift-json_2.9.0_2.4-M1を使用しています。問題:Android(Scala)アプリケーションでlift-jsonを使用したJSONの抽出

私はlift-jsonのreadmeから簡単な例を取りましたが、JSON-Stringから値を抽出しようとするたびに、Activityを呼び出すときにnet.liftweb.json.MappingExceptionが発生します。 「抽出する」ために引き渡されるargはないようです。

import _root_.android.app.Activity 
import _root_.android.os.Bundle 
import net.liftweb.json._ 

class JsonTest extends Activity { 

    override def onCreate(savedInstanceState: Bundle) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.mainactivity) 

    implicit val formats = DefaultFormats 
    case class NumList(numbers: List[Int]) 
    val json = parse(""" { "numbers" : [1, 2, 3, 4] } """) 
    json.extract[NumList] 
    } 
} 

と、ここで私が手例外:あなたは私の問題を解決するためにどのようなアイデアを持っている場合

06-29 12:09:31.548: ERROR/AndroidRuntime(405): FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{de.fhs.spirit/de.fhs.spirit.JsonTest}: net.liftweb.json.MappingException: Parsed JSON values do not match with class constructor 
    args= 
    arg types= 
    constructor=public de.fhs.spirit.JsonTest$NumList$2(de.fhs.spirit.JsonTest,scala.collection.immutable.List) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
    at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4627) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
    at dalvik.system.NativeStart.main(Native Method) 
    Caused by: net.liftweb.json.MappingException: Parsed JSON values do not match with class constructor 
    args= 
    arg types= 
    constructor=public de.fhs.spirit.JsonTest$NumList$2(de.fhs.spirit.JsonTest,scala.collection.immutable.List) 
    at net.liftweb.json.Meta$.fail(Meta.scala:185) 
    at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:257) 
    at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:280) 
    at net.liftweb.json.Extraction$.build$1(Extraction.scala:298) 
    at net.liftweb.json.Extraction$.extract0(Extraction.scala:345) 
    at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$extract0(Extraction.scala:194) 
    at net.liftweb.json.Extraction$.extract(Extraction.scala:42) 
    at net.liftweb.json.JsonAST$JValue.extract(JsonAST.scala:290) 
    at de.fhs.spirit.JsonTest.onCreate(JsonTest.scala:16) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
    ... 11 more 

は素晴らしいことだ

は、ここに私の活動です。 ありがとうございました!

挨拶、 Illaz

答えて

2

私はリフトは、このモードでリフレクションを使用しています疑い。 Androidではまったく動作しない場合があります。削除されたものが削除される場合があります。代わりにいくつかの代替手段を試してみることをお勧めします。

も参照this question - 私の疑惑は、REPLでは機能しないという発言から来ています。 REPLにはリフレクションはありませんが、そのパッケージ構造はLiftライブラリに混乱するかもしれません。

+0

あなたの答えをありがとう。私は現在Google Gsonを使用しています。残念ながらScalaはありませんが、うまくいきます。 – Illaz

+0

ScalaオブジェクトをGSonでデシリアライズできますか、Scalaをまったく使用していませんか? – Chopmo

+1

Gsonを使用していて、たとえばJson-StringにListがある場合、Gsonはjava.util.Listを返します。代わりにscala.Listを使用する場合は、 "import scala.collection.JavaConversions._"および "javaList.toList"を使用してこのリストを変換する必要があります。それはあなたが意味することです、チョップモ? – Illaz

関連する問題