2

タイプのオブジェクトとして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";
    }
}
4

3 に答える 3

2

JSONObject提供されたデータから常に手動でjsonを作成しようとするため、問題は実装にあると思われるかもしれません。JSON.stringify()ネイティブブラウザ機能を使用すると、はるかに高速になると確信しています。例:

public static native String stringify(JavaScriptObject object)/*-{
   return JSON.stringify(object);
}-*/;

唯一の問題は、古いブラウザ(IE6-7など)がこの機能をサポートしていないことです。

于 2012-12-07T21:37:33.467 に答える
0

JSONArrayのJavaDocがすでに警告しているように、配列が大きい場合、toString()に時間がかかる場合があります(JSONArrayを使用しない場合でも、toStringはJSONオブジェクトにコストがかかる可能性があります。JsArrayがある場合は、次のjoinメソッドを試すことができます。また、文字列を返し、ネイティブJavaScriptであるため、より高速になる可能性があります。

于 2012-12-07T21:25:58.983 に答える
0

の場合は、ではなく、JsArrayを使用する必要があります。new JSONArray(jsobj).toString()JSONObject

于 2012-12-07T22:26:42.253 に答える