ASP.NET JavascriptSerializer提供了不需要的数组内部数组?

时间:2011-06-19 05:16:28

标签: javascript asp.net json javascriptserializer

在开始之前,我很确定the answer given here is 是我答案的90%,但我无法弄清楚如何将它应用到我的情况中,所以我很感激任何帮助。

当我使用 JavasriptSerializer 序列化数组数组时,如下所示:

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
}

我得到这样的回应:

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

有些时候我希望ASP.NET使用此函数的输出,以便它可以动态生成Javascript到网页的标题中,如下所示:

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

为了让我在页面中得到以下JS:

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

在动态JS创建时调整JSON的创建或处理它的最佳方法是什么,以便我可以轻松地将数组数组附加到字符串'var myJSArr'上?


为了将来帮助某人,我将根据提供的答案/评论来编辑这个问题,以便在此处包含一些证明可以做我想要的代码。首先foo需要返回一个数组而不是像这样的字符串...

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
}

这导致JSON blob看起来像这样:

{"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);

1 个答案:

答案 0 :(得分:0)

您应该将数组的创建与JSON序列化分开,以便您可以仅在需要时序列化数据。

您从Web服务获得的响应问题是它已被序列化两次。首先,将数组序列化为字符串,然后框架将该字符串放入对象中并将其序列化。您应该从Web服务返回数组,并让框架为您序列化。

将数组放入脚本时,只需将数组序列化即可。