ASP.NET JavascriptSerializer предоставляет нежелательный массив в массиве? - PullRequest
0 голосов
/ 19 июня 2011

Прежде чем я начну, я почти уверен ответ, данный здесь: - это 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]]

Как лучше всего настроить создание JSON или его обработку ввремя динамического создания JS, чтобы я мог легко добавить массив массивов в строку '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
}

Это привело к созданию BLOB-объекта JSON, который выглядит следующим образом:

{"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 голосов
/ 19 июня 2011

Вы должны отделить создание массива от сериализации JSON, чтобы вы могли сериализовать данные только при необходимости.

Проблема с ответом, который вы получаете от веб-службы, состоит в том, что онбыл сериализован дважды.Сначала вы сериализуете массивы в строку, затем платформа помещает эту строку в объект и сериализует ее.Вы должны просто вернуть массивы из веб-службы и позволить платформе сериализовать ее для вас.

Вам нужно сериализовать массивы только тогда, когда вы поместите их в сценарий.

...