我有一个字符串,它看起来像这样:这是什么类型的符号?
[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}]
我不知道这是什么样的符号,这是由ASP .NET后台生成AFAIK。它看起来和JSON非常相似,但是调用json_decode()会失败。
有人可以给我一些这种符号的光线,并提供给我一个有效的方法来解析它到PHP的键/值数组?
我有一个字符串,它看起来像这样:这是什么类型的符号?
[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}]
我不知道这是什么样的符号,这是由ASP .NET后台生成AFAIK。它看起来和JSON非常相似,但是调用json_decode()会失败。
有人可以给我一些这种符号的光线,并提供给我一个有效的方法来解析它到PHP的键/值数组?
任何方式你可以改变输出?引用键名似乎允许它正常解析:
$test = '[{"text":"key 1","value":"value 1"},{"text":"key 2","value":"value 2"},{"text":"key 3","value":"value 3"}]';
var_dump(json_decode($test));
它看起来像JavaScript语法(类似于JSON)。正则表达式是解析它的方法。剥去'['和']',然后在','上分开。然后分别解析每个对象。
当一个字符串包含一个逗号时,问题就会出现。 – giorgian 2009-08-28 22:12:41
分开},{就像我在下面的答案中指出的那样。 – 2009-08-28 22:17:52
正则表达式可以处理包含逗号的引号字符串。我已经做了很多次了。 – 2009-08-29 01:48:14
它类似于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
我从来没有用过它,但也许给看看json_decode。
它看起来像一个自定义格式。在开头和结尾处替换[{和}]分隔符。然后爆炸的“},{”,你会得到这样的:
text:"key 1",value:"value 1"
text:"key 2",value:"value 2"
text:"key 3",value:"value 3"
在这一点上,你可以遍历数组中的每个元素,并使用的preg_match提取你的价值观。
从技术上讲,没有理由一个字符串不能包含'},{... ...即使它比包含一个字符串的字符串更不可能,' – 2009-08-28 22:24:08
我选择爆炸的原因},{是因为肯定在示例输出中显示为字段块内值之间的分隔符。但是,我同意。 – 2009-08-29 04:43:07
它看起来几乎就像一种数组式样的数据容器 - 文本是索引,值是值。
$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);
}
为了让您的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);
因为比赛永远不会重叠,一个字,接着冒号字符串永远不会匹配里面。
我还发现了不同PHP JSON实现之间的比较:
即样品是有效YAML,这是JSON的超集。 YAML似乎有at least 3 PHP libraries。
如果它实际上是YAML,那么最好使用真正的YAML库,而不是通过正则表达式运行它并将其扔到JSON库中。 YAML支持其他功能(除了未加引号的字符串),如果您的ASP.NET后端使用,则不会在旅程中生存。
我想我可以str_replace文本:和值:并用双引号括起来。 – 2009-08-28 22:30:33