Статьи

Использование JSON для файлов конфигурации, не зависящих от языка

Растущая доступность анализа JSON в серверных инфраструктурах повышает полезность JavaScript за пределами программирования на стороне клиента, обеспечивая базовый синтаксис для обобщенного формата обмена данными. Ну да.

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

В двух словах — объектный литерал JavaScript может быть проанализирован как JSON с (скажем) PHP для создания соответствующего ассоциативного массива.

Рассмотрим простой объект конфигурации, подобный этому:

const config = {
	'lang' : 'en', 
	'host' : 'sitepoint.com'
	};

Мы можем включить это в обычный <script>

 alert(config['lang']);    //outputs "en"

Все хорошо. Но мы также можем импортировать его в PHP и проанализировать так:

 $datastring = file_get_contents('config.js');

$regexes = array(
	array("p"=>"/[w]*(//).*$/m", "r"=>""),    //remove comments
	array("p"=>"/'/m", "r"=>""")                //replace single-quotes with double-quotes
	);	

foreach($regexes as $regex)
{
	$datastring = preg_replace($regex['p'], $regex['r'], $datastring); 
}

preg_match("/config[ ]?=[ ]?{([^;]+)\;/", $datastring, $matches);

$config = json_decode('{' . $matches[1], true);

И затем у нас есть те же данные в ассоциативном массиве PHP :

 echo $config['lang'];    //outputs "en"

Наличие парсинга JSON в PHP

Собственные функции json_encode и json_decode не были добавлены в PHP до версии 5.2. Если вы используете более раннюю версию, вам нужно будет реализовать ее самостоятельно, и для этого я бы порекомендовал класс JSON Services Михала Мигурски. Единственный недостаток этого заключается в том, что он поддерживает только преобразование в объект, а не в ассоциативный массив (как вызвано флагом true

Однако вы можете исправить это с помощью преобразования объекта в массив. Вот небольшой фрагмент, чтобы сделать это; Я этого не писал, но, боюсь, тоже не могу вспомнить, где я его нашел:

 function object_to_array($data) 
{
	if(is_array($data) || is_object($data))
	{
		$result = array(); 
		foreach($data as $key => $value)
		{ 
			$result[$key] = object_to_array($value); 
		}
		return $result;
	}
	return $data;
}

Тогда вы сможете сделать оригинальное преобразование следующим образом:

 $config = object_to_array(json_decode('{' . $matches[1]));

Вывод

Преимущество этого очевидно — и на стороне клиента, и на стороне сервера приложения могут получать свои данные конфигурации из одного управляемого источника.