这是什么样的表示法?

时间:2009-08-28 22:04:29

标签: php asp.net regex json

我有一个看起来像这样的字符串:

[{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 个答案:

答案 0 :(得分:2)

它类似于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

答案 1 :(得分:2)

你能改变输出吗?引用键名似乎允许它正常解析:

    $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 :(得分:2)

该示例有效YAML,它是JSON的超集。 YAML似乎有at least 3 PHP libraries

如果它实际上是YAML,那么最好使用真正的YAML库,而不是通过正则表达式运行并将其放在JSON库中。 YAML支持其他功能(除了不带引号的字符串),如果你的ASP.NET后端使用,它们将无法在旅行中存活下来。

答案 3 :(得分:0)

它看起来像javascript语法(类似于JSON)。正则表达式是解析它的方法。剥去'['和']',然后分开','。然后单独解析每个对象。

答案 4 :(得分:0)

它看起来像一个自定义格式。在开头和结尾替换[{和}]分隔符。然后在“},{”上爆炸,你得到这个:

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

此时,您可以迭代数组中的每个元素,并使用preg_match来提取您的值。

答案 5 :(得分:0)

它看起来几乎像一种数组样式的数据容器 - 文本是索引,值是值。

$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);
}

答案 6 :(得分:0)

要使json_decode()接受您的JSON数据,您可以使用以下正则表达式:

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);

因为匹配永远不会重叠,所以在字符串中后跟冒号的单词永远不会匹配。


我还发现了PHP的不同JSON实现之间的比较:

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

答案 7 :(得分:-2)

我从未使用过它,但也许可以看看json_decode