2009-08-28 105 views
0

我有一个字符串,它看起来像这样:这是什么类型的符号?

[{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的键/值数组?

回答

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

我想我可以str_replace文本:和值:并用双引号括起来。 – 2009-08-28 22:30:33

0

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

+2

当一个字符串包含一个逗号时,问题就会出现。 – giorgian 2009-08-28 22:12:41

+0

分开},{就像我在下面的答案中指出的那样。 – 2009-08-28 22:17:52

+0

正则表达式可以处理包含逗号的引号字符串。我已经做了很多次了。 – 2009-08-29 01:48:14

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 
-2

我从来没有用过它,但也许给看看json_decode

+2

你有没有读过*这个问题? – nickf 2009-08-28 22:17:15

+0

天哪,你是对的。我想我不应该在这个小时回答问题。 – giorgian 2009-08-28 22:26:12

0

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

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

在这一点上,你可以遍历数组中的每个元素,并使用的preg_match提取你的价值观。

+2

从技术上讲,没有理由一个字符串不能包含'},{... ...即使它比包含一个字符串的字符串更不可能,' – 2009-08-28 22:24:08

+0

我选择爆炸的原因},{是因为肯定在示例输出中显示为字段块内值之间的分隔符。但是,我同意。 – 2009-08-29 04:43:07

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

为了让您的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实现之间的比较:

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

2

即样品是有效YAML,这是JSON的超集。 YAML似乎有at least 3 PHP libraries

如果它实际上是YAML,那么最好使用真正的YAML库,而不是通过正则表达式运行它并将其扔到JSON库中。 YAML支持其他功能(除了未加引号的字符串),如果您的ASP.NET后端使用,则不会在旅程中生存。