2013-08-22 3 views
-1

Мне нужно сериализовать эту строку в многомерном массиве с помощью JSON. Как бы вы это сделали?Как бы вы преобразовали эту строку в JSON?

{frmb [0] [CssClass] = TextArea & frmb [0] [требуется] = истина & frmb [0] [значения] = пункт & frmb [1] [CssClass] = радио & frmb [1 ] [required] = true & frmb [1] [title] = rdo & frmb [1] [значения] [2] [значение] = один & frmb [1] [значения] [2] [исходный] = true & frmb [1] [значения] [3] [значение] = два & frmb [1] [значения] [3] [исходная] = false & frmb [2] [cssClass] = input_text & frmb [2] [required] = false & frmb [2] [values] = текст & frmb [3] [cssClass] = checkbox & frmb [3] [required] = true & frmb [3] [title] = chk & frmb [3] [значения] [2] [значение] = chk + 1 & frmb [3] [значения] [2] [ baseline] = true & frmb [3] [значения] [3] [значение] = chk + 2 & frmb [3] [значения] [3] [базовая линия] = ложь & frmb [4] [cssClass] = выберите & frmb [4] [required] = false & frmb [4] [multiple] = true & frmb [4] [title] = sel & frmb [4] [values] [2] [value] = sel1 & frmb [4] [ значения] [2] [базовый] = истина & frmb [4] [значения] [3] [значение] = ВЫБ2 & frmb [4] [значения] [3] [базовый] = ложь & form_id = не определено}

EDIT: Многомерность действительно ввергает меня в преобразование этой строки в 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; 
      } 

Я шлифовка на это в течение долгого времени - следовательно, уставший/ограниченный вопроса. Началось ощущение, что я делаю это «трудным путем» и хотел увидеть, есть ли у кого-нибудь просветленные идеи. ТИА

+1

Вы можете использовать json2 для сериализации в javascript: https://github.com/douglascrockford/JSON-js – Mansfield

+0

@Mansfield недействителен JSON. Будет ли json2 конвертировать его? –

+2

Если вы можете перечислить то, что вы пробовали, и ваши мысли, мы могли бы реально помочь больше, нет никакого смысла в том, чтобы кто-либо из нас изливал произвольные ответы, не зная, почему вы боретесь с этой проблемой. В качестве альтернативы просить кого-то разработать для вас весь подход, на самом деле не очень подходит для вопросов и ответов, потому что ни один ответ не является правильным без каких-либо подробностей от вас. Я знаю, как я это сделаю, но я не знаю, с чем вы боретесь. –

ответ

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.

+0

Спасибо. С этим все еще боролся, но вы приняли решение. –

+0

Это почти работает, но не десериализуется в объект, потому что значения поля могут быть либо строкой, либо массивом. Вы знаете, как этого избежать? [** "ценность": "Описание" ** "CssClass": "текстовое поле", "требуется" ложь}, {** "ценность" **: [{ "значение": "Экстра% 20Cheese",» базовый "ложь}, {" значение ":" пепперони», "базовый" ложь}, { "значение": "говядина", "базовый" ложь}], "CssClass": "флажок", "требуется" : false, "title": "Whats% 20on% 20your% 20pizza% 3F"}] –

+0

Никогда, кажется, это трюк: http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/ используя-с-4,0-и-динамическо-синтаксического анализа-json.aspx –

Смежные вопросы