2012-05-03 10 views
0

私はこれがHtmlJson.java内のバグであるか、私の実装であるかを判断しようとしています。私はちょうどPlayNバージョン1.2にアップグレードしました。私のコードはJson.ObjectJson.Writerにロードしようとします。これはJavaバージョンで動作します。HTML版のPlayNでは、次のJSON処理コードで例外が発生するのはなぜですか?

これは以下のコードです。これは私のコードのバグであれば、どのように私はそれを修正する可能性がある

ERROR: Uncaught Exception: 
java.lang.ClassCastException: com.google.gwt.core.client.JavaScriptObject$ cannot be cast to java.lang.String 
    at playn.html.HtmlJson$HtmlObject$.write$(HtmlJson.java:356) 
    at com.google.gwt.core.client.JavaScriptObject$.playn_core_Json$Object_write(JavaScriptObject.java) 
    at playn.core.json.JsonWriterBase.object(JsonWriterBase.java:119) 
    at playn.core.json.JsonWriterBase.object(JsonWriterBase.java:90) 
    at klenwell.sandbox.core.controllers.SandboxController.loadStoredData(SandboxController.java:121) 

private void loadStoredData() { 
    // storage parameters 
    String storageKey = "jsonData"; 
    Json.Object jsonData = PlayN.json().createObject();   

    // attempt to load stored data 
    String jsonString = PlayN.storage().getItem(storageKey); 

    // if not loaded, create stored data 
    if (jsonString == null) { 
     DemoApi.log("stored data not found"); 
     jsonData.put("firstWrite", new Date().toString()); 

    // else display data 
    } else { 
     jsonData = PlayN.json().parse(jsonString); 
     DemoApi.log("stored data loaded"); 
     DemoApi.log("data first written at " + jsonData.getString("firstWrite")); 
     DemoApi.log("data last read at " + jsonData.getString("lastRead")); 
     DemoApi.log("data last written at " + jsonData.getString("lastWrite")); 
    } 

    // update last read 
    jsonData.put("lastRead", new Date().toString()); 

    // write data 
    Json.Writer jsonWriter = PlayN.json().newWriter(); 
    jsonWriter.object(jsonData);  // <--- EXCEPTION RAISED HERE 
    jsonString = jsonWriter.write(); 

    // store data as json 
    PlayN.storage().setItem(storageKey, jsonString); 

    // confirm 
    if (PlayN.storage().isPersisted()) { 
     DemoApi.log("data successfully persisted"); 
    } else { 
     DemoApi.log("failed to persist data"); 
    } 
} 

例外を:例外がライン(コード内のノートコメント)によって提起されましたか?

+0

関連性のある追加の情報が1つ追加されています。 'JsonData'オブジェクトをログすると、ログに' INFO:[object Object] 'と表示されます。これは、[HtmlJson.java](http://code.google.com/p/playn/source/browse)の 'if(o == null || isValueString(o))'行の問題を指摘しているようです/html/src/playn/html/HtmlJson.java?name=playn-1.2#356)、特にisValueString関数です。それが 'false'であるべきであるときに' true'と評価されているようです。 – klenwell

答えて

0

代替手段が見つかりました。元のコードほどエレガントな、それはHTML5で正常にテストされていません:

private void loadStoredData() { 
    // storage parameters 
    String storageKey = "jsonData"; 
    Json.Object jsonData = PlayN.json().createObject(); 

    // to reset storage, uncomment this line 
    //PlayN.storage().removeItem(storageKey); 

    // attempt to load stored data 
    String jsonString = PlayN.storage().getItem(storageKey); 

    // if not loaded, create stored data 
    if (jsonString == null) { 
     DemoApi.log("stored data not found"); 
     jsonData.put("firstWrite", new Date().toString()); 

    // else display data 
    } else { 
     jsonData = PlayN.json().parse(jsonString); 
     DemoApi.log("stored data loaded"); 
     DemoApi.log("data first written at " + jsonData.getString("firstWrite")); 
     DemoApi.log("data last read at " + jsonData.getString("lastRead")); 
     DemoApi.log("data last written at " + jsonData.getString("lastWrite")); 
    } 

    // update last read 
    jsonData.put("lastRead", new Date().toString()); 

    // write data (this works in Java -- not in HTML) 
    // see http://stackoverflow.com/q/10425877/1093087 
    /* 
    Json.Writer jsonWriter = PlayN.json().newWriter(); 
    jsonWriter.object(jsonData).end(); 
    jsonString = jsonWriter.write(); 
    */ 

    // alternative write routine 
    Json.Writer jsonWriter = PlayN.json().newWriter(); 
    jsonWriter.object(); 
    for (String key : jsonData.keys()) { 
     jsonWriter.value(key, jsonData.getString(key)); 
    } 
    jsonWriter.end(); 
    jsonString = jsonWriter.write(); 

    // store data as json 
    PlayN.storage().setItem(storageKey, jsonString); 

    // confirm 
    if (PlayN.storage().isPersisted()) { 
     DemoApi.log("data successfully persisted"); 
    } else { 
     DemoApi.log("failed to persist data"); 
    } 
} 

DemoApi.log、記録のために、私はブラウザでテストするとき、画面への出力をログに記録する斜線の方法です。私は後で、PlayN.log()サービスがChromeコンソールに正常にログすることを発見しました。

関連する問題