2013-08-26 2 views
-1

Как преобразовать JSON, содержащий функцию JS определенийПреобразовать JSON, содержащий JS определение функции для объекта JavaScript

{ 
    "a1": "5", 
    "b1": "10", 
    "c1": "function(param1,param2) { return param1 +param2}" 
} 

на объект JavaScript, содержащий эти функции (а не строка с определением):

{ 
    a1: 5, 
    b1: 10, 
    c1: function(param1,param2) { return param1 + param2} 
} 
+0

Возможный дубликат [Как разобрать JSON в JavaScript] (http://stackoverflow.com/questions/4935632/how-to-parse-json-in-javascript) – zzzzBov

+0

'' a1 '' цитаты не имеют значения , но строка для этого должна быть заменена на 'parseInt()' для этого значения, чтобы получить целочисленное значение, но строка JSON действительно должна быть '' a1 ": 5'. Зло eval для функции? –

+2

** Не дубликат! ** Парень хочет оценить значение 'c1'. – ThiefMaster

ответ

0

с помощью функции JS JSON.parse

var myobj = JSON.parse("{\"a1\": \"5\", \"b1\": \"10\", \"c1\": \"function(param1,param2) { return param1 +param2}\" }"); 
0

Два шага : Разбор JSON, а также содействовать исходный код функции к функции:

var jsonObj = JSON.parse(jsonFromAjax); 
jsonObj.c1 = eval(jsonObj.c1); 
+0

hallo, by eval() "функция (param1, param2) {return param1 + param2}" по-прежнему с кавычками :(, TXH – adoweb

+0

@adoweb: Нет, это не так? – Eric

2

Вы можете передать функцию Reviver к JSON.parse. Это позволяет применять пользовательскую логику к анализируемым значениям.

В этой функции вы можете проверить начинается ли значение с шаблоном function(...) {:

var obj = JSON.parse(str, function(k, v) { 

    if (/^\s*function\s*\([^)]*\)\s*{/.test(v)) { 
     try { 
      // using the Function constructor to evaluate the function 
      // definition in global scope 
      return Function('return ' + v)(); 
     } 
     catch() { 
      return v; // maybe not a JS function definition after all 
     } 
    } 
    return v; 
}); 

DEMO

Конечно, вы также можете просто итерацию над результирующим объектом и применить ту же логику после того, как разбор, но использование функции reviver проще, если у вас есть вложенные объекты/массивы.

Обратите внимание, что это очень простой тест и будет работать только для анонимных функций. Если вы назвали функции, вам нужно соответствующим образом скорректировать выражение. Но это основная идея.

+0

Отлично, спасибо большое – adoweb

-1

Вот пример, который преобразует строку json, содержащую функцию, обратно в объект json с допустимым объявлением функции.

var jsonstring = "{\" schema \ ": {\" title \ ": \" Пользовательская обратная связь \ ", \" description \ ": \" so \ ", \" type \ ": \" object \ ", \" properties \ ": {\" name \ ": {\" type \ ": \" string \ "}}}," + "\" options \ ": {\" form \ ": { \ "attributes \": {}, \ "buttons \": {\ "submit \": {\ "title \": \ "It \", \ "click \": \ "function() {alert (' Здравствуйте');}\" }}} }}";

var jsonData = JSON.parse (jsonstring);

function Iterate(data) 
{ 
     jQuery.each(data, function (index, value) { 
     if (typeof value == 'object') { 
      Iterate(value); 
     } 
     else { 
      if (value.indexOf("function()") > -1) 
       data[index] = eval("(" + value + ")"); 
     } 
    }); 

}; 

Iterate(jsonData); 

В этом случае jsonData.options.form.buttons.submit.click();

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