【问题标题】:ASP.NET JavascriptSerializer provides unwanted array-within-array?ASP.NET JavascriptSerializer 提供了不需要的数组内数组?
【发布时间】:2011-06-19 16:25:08
【问题描述】:

在我开始之前,我很确定 the answer given here is 是我回答的 90%,但我只是不知道如何将它应用于我的情况,所以我会很感激任何帮助。 em>

当我使用 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' 上?


为了将来对某人有所帮助,我将根据提供的答案/cmets 编辑此问题,以在此处包含一些代码,这些代码证明可以满足我的要求。首先 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);

【问题讨论】:

  • 序列化程序的引用输出看起来很可疑,“d”属性的值是一个字符串,它应该是一个数组。你确定不是:{"d":[[1,10,100],[2,20,200],[3,30,300],[4,40,400],[5,50,500]]}? (请注意,现在数组周围没有引号。)
  • 感谢您的评论。你说得对,问题是“d”的值是一个字符串。只是为了混淆问题,我认为这是“正确”的答案,直到我再想一想!再次感谢您的帮助。

标签: javascript asp.net json javascriptserializer


【解决方案1】:

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

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

只需要在放入脚本时序列化数组即可。

【讨论】:

  • 非常感谢您的回复 - 一旦我阅读了我就知道我做错了什么。我将对问题进行一些编辑,以便其他人可以看到应该如何完成。再次感谢。
  • @southof40:您正在序列化对象内的数组,然后您正在反序列化它,然后您再次手动序列化它。如果仅序列化数组,则只需序列化一次。将函数的返回类型从string更改为int[][]
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
相关资源
最近更新 更多