2015-06-16 2 views
-1

Я пытаюсь обрабатывать JSON объекты чисто, но JSON присваивается переменной, как это:Как хрюкать извлечь объект JSON, когда файл присваивает объект переменной

var test = { "foo" : "bar" }; 

я могу использовать файловые структуры, как это:

{ "foo" : "bar" } 

и захватить JSON как это:

var jsonfile = grunt.file.readJSON(source) 

Но мне нужно автоматизировать Тхи s и сохранить текущую файловую структуру.

+0

Ну, 'var test = {" foo ":" bar "};' не JSON, это JavaScript. Я не уверен, чего вы пытаетесь достичь. –

+0

Я пытаюсь прочесть объекты в моей задаче для задания. –

+0

Когда я удаляю назначение переменной, он совместим с grunt.file.readJSON, поэтому я бы рассмотрел синтаксис очень близко здесь. Я просто хочу, чтобы импорт работал, когда есть назначение переменной для объекта, а не вручную удаление назначений переменных. –

ответ

0

Проблема в том, что я не смог найти способ включить файл javascript в свою задачу. Так что я сделал вместо этого, был прочитан файл как буквальная строка.

Затем с помощью regex я удалил части строки, представляющие присвоение переменных. Наконец-то я мог бы разобрать строку как объект

var test = grunt.file.read(source), 
    re = new RegExp('var?.test?.=|;','gi'), 
    test = JSON.parse(test.replace(re, "")); 
+0

У Felix King было лучшее решение - просто убедитесь, что ваш JS-файл экспортирует что-то, а затем «требует» ваш JS-файл в верхней части вашего файла grunt, так же, как вы «требовали» всех ваших других плагинов grunt. – Adam

+0

Ну, это не сработало, когда я попробовал это. Однако это сделало трюк. –

0

решение FelixKing осознало:

//somefile.js 
var someJSONObject = { 
    SOME_KEY: "VALUE"; 
}; 

module.exports = someJSONObject; 

//Gruntfile.js 
var json = require('somefile'); 
console.log(json.SOME_KEY); //logs "VALUE" 

module.exports = function(grunt) { 
    //...rest of grunt file 
} 

путь более обслуживаемой (и способ более гибкий), чем разбор «переменная =» из сырой строки с RegEx. Вы не ограничены только JSON, но любой JavaScript.

Просто предвосхитить любые проблемы у вас есть о повторном использовании файла JS для нескольких целей (так module не может быть определена в somefile.js, когда это не в среде узла), вы можете сделать это:

//somefile.js 
    var someJSONObject = { 
     SOME_KEY: "VALUE"; 
    }; 

    //CommonJS export syntax 
    //don't do anything if module.exports is not in scope 
    if (typeof module === "object" && typeof module.exports === "object") { 
     module.exports = someJSONObject; 
    } 
+0

Я согласен, что это выглядит более ремонтопригодным, я не знаю, что я делал по-другому, но когда я это пробовал, переменная, которую я присвоил «someJSONObject», имела только null. –

+0

@JackShultz - мой плохой, строка в файле Gruntfile.js должна быть прочитана: 'require ('somefile');' – Adam

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