2011-06-19 10 views
0

私が始める前に、私は確信していますthe answer given here is私の答えの90%ですが、私はどのように私の状況にそれを適用する方法を見つけることができないので、私は助けに感謝したいと思います。ASP.NET JavascriptSerializerは不要なarray-within-arrayを提供しますか?

私は次のように配列の配列をシリアライズするJavasriptSerializerを使用します。ときに私がございます

{"d":"[[1,10,100],[2,20,200],[3,30,300],[4,40,400],[5,50,500]]"} 

string foo() 
{ 
    int[][] JaggedArray = new int[5][]; 
    int i = 0; 
    JaggedArray[i] = new int[] { 1, 10, 100 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 2, 20, 200 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 3, 30, 300 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 4, 40, 400 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 5, 50, 500 }; 
    i = i + 1; 
    JavaScriptSerializer js = new JavaScriptSerializer(); 
    string strJSON = js.Serialize(JaggedArray); 
    return strJSON 
} 

は私が応答でこのような何かを得ますASP.NETがこの関数の出力を消費して、動的にJのJavaScriptヘッダーを生成できるようにするJSONの作成のいずれかを調整するための最良の方法は何

var myJSArr = [[1,10,100],[2,20,200],[3,30,300],[4,40,400],[5,50,500]] 

か:私は私のページ内で、次のJSで終わるようにするために

HtmlGenericControl Include = new HtmlGenericControl("script"); 
Include.Attributes.Add("type", "text/javascript"); 
Include.InnerHtml = "var myJSArr = " + foo() + ";" ; 
Page.Header.Controls.Add(Include); 

:このようなウェブページ彼動的JSの作成時にその配列を処理して、配列の配列を 'var myJSArr'という文字列に簡単に追加できるようにしますか?私は私が望んで行うことを証明し、ここでいくつかのコードを含めることの回答/コメントの光の中でこの質問を編集するつもりだ未来の誰かを助けることを期待して


。まず、これは次のようになりますJSONのブロブが生じ

string foo() 
{ 
    int[][] JaggedArray = new int[5][]; 
    int i = 0; 
    JaggedArray[i] = new int[] { 1, 10, 100 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 2, 20, 200 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 3, 30, 300 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 4, 40, 400 }; 
    i = i + 1; 
    JaggedArray[i] = new int[] { 5, 50, 500 }; 
    i = i + 1; 

    return JaggedArray 
} 

...配列ではない、このような文字列を返すために必要なFOOは:

{"d":[[100,101,102],[200,201,202],[300,301,302],[400,401,402],[500,501,502]]} 

私は、その後に次のコードを使用することができましたJSコードの動的ビルド私はすべての次のコードは、それを行うための最善の方法であることはよく分からない(それはひどく複雑にすべきではない何かのためのコードの多くの地獄のように思える)が、それは、少なくとも仕事

Dictionary<string, int[][]> dd = js.Deserialize<Dictionary<string, int[][]>>(foo()); 
int[][] arrASRValues = dd["d"]; 
List<string> lstASRValues = new List<string>(arrASRValues.Length); 
foreach(int[] lstASRElement in arrASRValues) 
{ 
    lstASRValues.Add(String.Format("[{0},{1},{2}]", lstASRElement[0], lstASRElement[1], lstASRElement[2])); 
} 
String strASRValues = String.Join(",", lstASRValues.ToArray()); 
strASRValues = "val myJSArr = [" + strASRValues + "];"; 
Include.InnerHtml = strASRValues; 
Page.Header.Controls.Add(Include); 
+0

シリアライザからの引用出力が疑わしいと思われる場合、 "d"プロパティの値は配列でなければならない文字列です。 '{" d ":[[1,10,100]、[2,20,200]、[3,30,300]、[4,40,400]、[5,50,500]}}のようなものではないでしょうか? (今は配列の周りに引用符がないことに注意してください。) –

+0

ご意見ありがとうございます。あなたは文字列である "d"の値が問題だったのは間違いありません。問題を混乱させるだけで、私はもう少し考えてみるまでこれが正しい答えだと思った!あなたの助けをもう一度ありがとう。 – shearichard

答えて

0
を行います

配列の作成とJSONシリアライゼーションを分離して、必要なときにのみデータをシリアライズできるようにする必要があります。

Webサービスからの応答の問題は、そのサービスが2回シリアル化されていることです。最初に、配列を文字列にシリアライズすると、フレームワークはその文字列をオブジェクトに入れ、それをシリアライズします。 Webサービスから配列を返すだけで、フレームワークでそれをシリアル化する必要があります。

配列をスクリプトに挿入するときに、配列をシリアル化する必要があります。

+0

お返事ありがとうございます。一度読んだら、間違っていることが分かりました。他の人がどのようにしてやるべきかを見ることができるように、私は質問にいくつかの編集を加えるつもりです。再度、感謝します。 – shearichard

+0

@ southof40:オブジェクト内の配列を直列化しています。次にそれをデシリアライズしてから、再度手動でシリアル化しています。アレイのみをシリアル化する場合は、一度シリアル化する必要があります。関数の戻り値の型を 'string'から' int [] [] 'に変更してください。 – Guffa

関連する問題