Что это за нотация? - PullRequest
       21

Что это за нотация?

0 голосов
/ 29 августа 2009

У меня есть строка, которая выглядит следующим образом:

[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}]

Я не уверен, что это за нотация, AFAIK она генерируется бэкэндом ASP .NET. Это выглядит очень похоже на JSON, но вызов json_decode () на этом завершается неудачей.

Может ли кто-нибудь пролить свет на такую ​​нотацию и дать мне эффективный способ ее преобразования в массив ключ / значение с помощью PHP?

Ответы [ 8 ]

2 голосов
/ 30 августа 2009

Этот образец действителен YAML , который является надмножеством JSON. Похоже, как минимум 3 библиотеки PHP для YAML.

Если это действительно YAML, вам лучше использовать настоящую библиотеку YAML, чем запускать ее через регулярное выражение и добавлять ее в свою библиотеку JSON. YAML поддерживает другие функции (кроме строк без кавычек), которые, если ваш бэкэнд ASP.NET использует, не выдержат поездки.

2 голосов
/ 29 августа 2009

Как вы можете изменить выход? Заключение в кавычки имен ключей, кажется, позволяет ему нормально анализировать:

    $test = '[{"text":"key 1","value":"value 1"},{"text":"key 2","value":"value 2"},{"text":"key 3","value":"value 3"}]';

    var_dump(json_decode($test));
2 голосов
/ 29 августа 2009

Это JSON-подобный, но, очевидно, не совсем в спецификации. Функция PHP json_decode любит только двойные кавычки:

// the following strings are valid JavaScript but not valid JSON

// the name and value must be enclosed in double quotes
// single quotes are not valid 
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null

// the name must be enclosed in double quotes
$bad_json = '{ bar: "baz" }';
json_decode($bad_json); // null

// trailing commas are not allowed
$bad_json = '{ bar: "baz", }';
json_decode($bad_json); // null
0 голосов
/ 30 августа 2009

Чтобы получить данные JSON, принятые json_decode(), вы можете использовать следующее регулярное выражение:

function json_replacer($match) {
  if ($match[0] == '"' || $match[0] == "'") {
    return $match;
  }
  else {
    return '"'.$match.'"';
  }
}

$json_re = <<<'END'
/ " (?: \\. | [^\\"] )* "     # double-quoted string, with escapes
| ' (?: \\. | [^\\'] )* '     # single-quoted string, with escapes
| \b [A-Za-z_] \w* (?=\s*:)   # A single word  followed by a colon
/x
END;

$json = preg_replace_callback($json_re, 'json_replacer', $json);

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


Я также нашел сравнение между различными реализациями JSON для PHP:

http://gggeek.altervista.org/sw/article_20061113.html

0 голосов
/ 29 августа 2009

Это выглядит почти как контейнер данных в стиле массива: текст является индексом, а значение - значением.

$string = ....;
$endArray = array()
$string = trim($string,'[]');
$startArray = preg_split('/{.+}/'); 
// Array of {text:"key 1",value:"value 1"}, this will also skip empty conainers
foreach( $startArray as $arrayItem ) {
  $tmpString = trim($arrayItem,'{}');  // $tmp = text:"key 1",value:"value 1"
  $tmpArray = explode(',',$tmpString); // $tmpArray = ('text: "key 1"', 'value: "value 1"')
 $endArray[substr($tmpArray[0],7,strlen($tmpArray[0])-1)] = substr($tmpArray[1],7,strlen($tmpArray[1])-1);
}
0 голосов
/ 29 августа 2009

Это похоже на пользовательский формат. Замените разделители [{и}] в начале и в конце. Затем взорвитесь на "}, {", и вы получите это:

text:"key 1",value:"value 1"
text:"key 2",value:"value 2"
text:"key 3",value:"value 3"

В этот момент вы можете перебирать каждый элемент массива и использовать preg_match для извлечения ваших значений.

0 голосов
/ 29 августа 2009

Я никогда не использовал его, но, возможно, взгляните на json_decode .

0 голосов
/ 29 августа 2009

Похоже, синтаксис JavaScript (похож на JSON). Регулярные выражения - это способ анализа. Уберите '[' и ']', затем разделите на ','. Затем проанализируйте каждый объект в отдельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...