-1

我需要使用 JSON 将此字符串序列化为多维数组。你会怎么做?

{frmb[0][cssClass]=textarea&frmb[0][required]=true&frmb[0][values]=para&frmb[1][cssClass]=radio&frmb[1][required]=true&frmb[1][title]=rdo&frmb [1][values][2][value]=one&frmb[1][values][2][baseline]=true&frmb[1][values][3][value]=two&frmb[1][values][3 ][baseline]=false&frmb[2][cssClass]=input_text&frmb[2][required]=false&frmb[2][values]=text&frmb[3][cssClass]=checkbox&frmb[3][required]=true&frmb[3][ title]=chk&frmb[3][values][2][value]=chk+1&frmb[3][values][2][baseline]=true&frmb[3][values][3][value]=chk+2&frmb [3][values][3][baseline]=false&frmb[4][cssClass]=select&frmb[4][required]=false&frmb[4][multiple]=true&frmb[4][title]=sel&frmb[4][ values][2][value]=sel1&frmb[4][values][2][baseline]=true&frmb[4][values][3][value]=sel2&frmb[4][值][3][基线]=false&form_id=undefined}

编辑: 多维性真的让我把这个字符串转换成 JSON 搞砸了。我尝试去掉括号以获得数组的索引列表,但以有用的方式重建数组一直是最大的挑战。

所以我一直在做:

private static List<string> StripBrackets(string input)
        {
            var ret = new List<string>();
            var indx = 0;
            do
            {
                input = input.TrimStart('[');
                indx = input.IndexOf(']');
                if(indx !=-1)
                {
                    var newVal = input.Substring(0, indx);
                    ret.Add(newVal);
                    input = input.Remove(0, indx+1);
                }
            } while (indx != -1);

                //-- this is where I bonked
                string[,] results = new string[ret.Count, 23];    
                foreach (var r in ret)
                {                    
                }    
                 return ret;
            }

我已经研究了很长时间 - 因此是疲惫/有限的问题。我开始觉得我是在“艰难地”做这件事,想看看有没有人有更好的想法。TIA

4

1 回答 1

2

扩展@ratchetfreak 的评论:

var str = "{frmb...";

//sanitize string
str = str.substring(1, str.length-1); //remove braces
str = str.replace(/\[([a-z]+)\]/gi, '["$1"]'); //enclose non-numeric keys in double quotes
str = str.replace(/=([^&]+)/g, '="$1"'); //enclose values in double quotes
str = str.replace(/"(true|false)"/g, "$1"); //remove double quotes around boolean values
str = str.replace(/&/g, ";"); //replace all ampersands with semi-colons

//initialize "frmb"
var frmb = [];
for (var i = 0; i < 5 /* a guess as to how long "frmb" will be */; i++){
  var values = [];
  for (var j = 0; j < 5 /* a guess as to how long each "values" field will be */; j++){
    values.push({});
  }
  frmb.push({values:values});
}

//evaluate as Javascript
eval(str);

//marshal to string
var result = JSON.stringify(frmb);

使该解决方案难以通用的部分是您需要初始化“frmb”。例如,如果frmb[0].cssClass不先初始化frmb一个数组,然后使用push(). 因此,您需要估计您认为有多大frmb,以及每个values子阵列有多大。

于 2013-08-22T16:55:23.890 回答