2015-03-25 3 views
1

У меня есть этот JSON в качестве результата функции JSON.stringify():функции Анализировать внутри Json

{"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"} 

Как вы можете видеть, что есть функции внутри значений. Я хочу перестроить этот объект JavaScript, моя цель - удалить кавычки в risult, а также значения; потому что функции в этом случае распознаются как строка. Я хочу что-то вроде этого: {key : value}

Теперь я получаю: {key : "value"}

+5

с 'eval' или' Function' (после некоторой предварительной обработки). Вы можете автоматизировать это, передав функцию reviver на 'JSON.parse', как описано в [документации MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ JSON/синтаксический анализ). Однако я настоятельно рекомендую хранить данные как данные. –

+0

Я пробовал оба, но ничего. 'eval' не работает, потому что значения не имеют имени функции. –

+1

'eval ('+ str +') ')' –

ответ

1

БЫСТРЫЙ ОТВЕТ:

Функция ниже будет делать:

function fix(obj){ 

    for (var property in obj) { 
     if (obj.hasOwnProperty(property)) { 
      obj[property] = eval("(" + obj[property] + ")"); 
     } 
    } 

} 

Если OBJ имеет свой JSON проанализирован объект, то нужно сделать следующее:

fix(obj); 
console.log(obj); // in case you want to see the change in the console 

EXPLANAT ION (ЕСЛИ ВАМ НУЖНО ОДИН):

Вы сможете получить выражение функции javascript, если вы вставляете строку с круглыми скобками '()' перед вызовом eval.

Итак шаги, чтобы достичь желаемого результата, являются:

  1. Заключите строковое выражение функции в скобках (см сносок по той причине, почему)
  2. Вызов функции Eval для вычисления выражения функции декларации
  3. Присвоить выражение объявления функции тому же свойству, которое содержит значение строки

Для упрощенного примера, который вы указали, вы можете получить желаемые результаты по:

var obj = {"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g 

[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio= 

{provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if 

('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type|| 

d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"}; 

obj.get = eval("(" + obj.get + ")"); 
obj.post = eval("(" + obj.post + ")"); 

Вы можете автоматизировать, что с помощью следующей функции:

function fix(obj){ 

    for (var property in obj) { 
     if (obj.hasOwnProperty(property)) { 
      obj[property] = eval("(" + obj[property] + ")"); 
     } 
    } 

} 

Ваш окончательный код должен быть что-то вроде:

function fix(obj){ 

     for (var property in obj) { 
      if (obj.hasOwnProperty(property)) { 
       obj[property] = eval("(" + obj[property] + ")"); 
      } 
     } 

    } 


var obj = {"get":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if('object'==typeof g)for(h in g)i[h]=g 

    [h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type||d,i.oauthio= 

    {provider:a,tokens:b,request:c},e.http(i)}","post":"function (f,g){'use strict';var h,i;if(i={},'string'==typeof f){if 

    ('object'==typeof g)for(h in g)i[h]=g[h];i.url=f}else if('object'==typeof f)for(h in f)i[h]=f[h];return i.type=i.type|| 

    d,i.oauthio={provider:a,tokens:b,request:c},e.http(i)}"}; 

fix(obj); 

Сноски:

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

Why does JavaScript's eval need parentheses to eval JSON data?

+0

С вашим кодом я получаю этот результат: '{get: function(), post: function()}' Где я ошибаюсь? –

+0

Я сосредоточился на функциях, код не работает, потому что функция содержит неопределенные переменные, которые фактически определены вне функции, решений? –

+0

Он работает, по крайней мере, с приведенным вами примером, если у вас есть другие случаи, которые не работают, отправьте их здесь, чтобы я мог помочь вам. – bsd

1

это решение лучше, чем при использовании eval:

скажем obj содержит ваш JSON, что означает, что функция obj.get но жалом , чтобы преобразовать его в реальной функции, вы можете использовать конструктор Function

obj.get = new Function(obj.get); 

Обратите внимание, что я пробовал на вашем коде, но строка, которую вы опубликовали, содержит некоторые ошибки. убедитесь, что ваша функция верна.

+0

Ellegant solution, полезно знать это :) – Balder

+0

Возможно, вам захочется объяснить, почему это лучше. Также это не будет просто работать с кодом OP. Необходимо выполнить некоторую предварительную обработку. –

+0

Спасибо за помощь, если я захочу поставить этот код в 'for' или 'while'? –

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