タイプのオブジェクトとしてGWTで表現しているdoubleの2D配列がありますJsArray<JsArrayNumber>
。配列をJavascriptに変換すると、次のようになります。
var test = [[0.6578396255487482,7.875995798E-314,3.1688557021480858E55],
[9.365832954E-315,0.9866897170404328,9.378991533366766E54],
[4.999803162025956E51,6.32672779777942E54,1.987536773023561]];
問題は、を使用してGWTオブジェクトをJSON文字列にシリアル化しようとするとJSONObject.toString()
、プロセスがハングアップし、終了しないことです。いくつかの混乱を通して、私は非常に小さい数(E-315で終わるもの)をゼロに変更すると、シリアル化が正常に完了することを理解しました。なぜGWTはこれらの数値に苦労しているのですか?JSONObject.toString()
このようなものをシリアル化するための正しい方法はありますか?これらの数は非常に小さいので、シリアル化する前にこれらのオブジェクトをサニタイズすることができますが、多少機密性の高い計算の結果であるため、可能であれば変更しないことをお勧めします。
編集:
動作を示すサンプルの単体テストを次に示します。
import org.junit.Test;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.junit.client.GWTTestCase;
public class SmallDoubleTest extends GWTTestCase{
@Test
public void test(){
// When the very small numbers are replaced with 0 everything works
String jsonStr = "[[0.6578396255487482,0,3.1688557021480858E55]," +
"[0,0.9866897170404328,9.378991533366766E54]," +
"[4.999803162025956E51,6.32672779777942E54,1.987536773023561]]";
JsArray<JsArrayNumber> jsobj = buildArray(jsonStr);
System.out.println("First Item: " + jsobj.get(0).get(0));
System.out.println("Last Item: " + jsobj.get(2).get(2));
JSONObject jsonobj = new JSONObject(jsobj);
System.out.println(jsonobj.toString());
// Putting them back in cause everything to hang on jsonobj.toString();
jsonStr = "[[0.6578396255487482,7.875995798E-314,3.1688557021480858E55]," +
"[9.365832954E-315,0.9866897170404328,9.378991533366766E54]," +
"[4.999803162025956E51,6.32672779777942E54,1.987536773023561]]";
jsobj = buildArray(jsonStr);
System.out.println("First Item: " + jsobj.get(0).get(0));
System.out.println("Last Item: " + jsobj.get(2).get(2));
jsonobj = new JSONObject(jsobj);
System.out.println(jsonobj.toString());
}
public static native JsArray<JsArrayNumber> buildArray(String json) /*-{
return eval('(' + json + ')');
}-*/;
public String getModuleName(){
return "com.iai.cgs.rest.gwtclient.CGSGWTClient";
}
}