-1

JSON を使用して、この文字列を多次元配列にシリアル化する必要があります。どのようにしますか?

{frmb[0][cssClass]=textarea&frmb[0][必須]=true&frmb[0][値]=para&frmb[1][cssClass]=ラジオ&frmb[1][必須]=true&frmb[1][タイトル]=rdo&frmb [1][値][2][値]=one&frmb[1][値][2][ベースライン]=true&frmb[1][値][3][値]=2&frmb[1][値][3 ][ベースライン]=false&frmb[2][cssClass]=input_text&frmb[2][必須]=false&frmb[2][値]=text&frmb[3][cssClass]=チェックボックス&frmb[3][必須]=true&frmb[3][タイトル]=chk&frmb[3][値][2][値]=chk+1&frmb[3][値][2][ベースライン]=true&frmb[3][値][3][値]=chk+2&frmb [3][値][3][ベースライン]=false&frmb[4][cssClass]=select&frmb[4][必須]=false&frmb[4][複数]=true&frmb[4][タイトル]=sel&frmb[4][値][2][値]=sel1&frmb[4][値][2][ベースライン]=true&frmb[4][値][3][値]=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;
            }

私はこれに長い間取り組んできました-したがって、疲れた/限られた質問です。私はこれを「難しい方法」でやっているように感じ始め、啓発された誰かがより良いアイデアを持っているかどうかを知りたがっていました. ティア

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 に答える