【发布时间】:2016-01-15 12:51:49
【问题描述】:
我有一个这样的字符串:
{
"XXX" "XXX"
"XXX" "XXX"
"XXX"
{
"XXX" "XXX"
"XXX" "XXX"
"XXX"
{
"XXX" "XXX"
}
"XXX"
{
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
}
"XXX" "XXX"
}
"XXX"
{
"XXX" "XXX"
"XXX"
{
"XXX" "XXX"
}
"XXX"
{
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
}
"XXX" "XXX"
}
"XXX"
{
"XXX" "XXX"
"XXX"
{
"XXX" "XXX"
}
"XXX"
{
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
}
"XXX" "XXX"
}
"XXX"
{
"XXX" "XXX"
"XXX"
{
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
"XXX" "XXX"
}
"XXX" "XXX"
}
"XXX"
{
"XXX"
{
"XXX" "XXX"
}
"XXX"
{
"XXX" "XXX"
"XXX" ""
}
"XXX"
{
"XXX" "XXX"
"XXX" ""
}
"XXX"
{
"XXX" "XXX"
"XXX" ""
}
"XXX"
{
"XXX" "XXX"
"XXX" ""
}
"XXX"
{
"XXX" "XXX"
"XXX" ""
}
"XXX"
{
"XXX" "XXX"
"XXX" ""
}
}
}
它看起来像 JSON,但实际上不是:它缺少所有的逗号 (',') 和所有的冒号 (":")。我正在尝试找到一种方法来解析它并将其转换为有效的 JSON 字符串。
我的猜测是使用表格和换行符在字符串中找到我的方式,但到目前为止我无法将它转换为有效的 JSON。
我想出了这个,它有效,但我认为效率不高或不安全:
$e = explode( "\n", $string );
foreach( $e as $k => $l ) {
$next = str_replace( "\t", '', $e[ $k + 1 ] );
$isParam = strstr( $l, "\"\t\t\"" );
$currentClean = str_replace( "\t", '', $l );
if ( $isParam )
$e[ $k ] = str_replace( "\"\t\t\"", '":"', $l );
if ( $isParam && $next != '}' )
$e[ $k ] .= ',';
if ( $currentClean == '}' && $next != '}' && $next )
$e[ $k ] .= ',';
if ( preg_match( '#^"(.*)"$#', $currentClean ) && !$isParam )
$e[ $k ] .= ':';
}
$json = implode("\n", $e);
如何改进?
【问题讨论】:
-
字符串从何而来?
-
@AlexAndrei 它来自一个我无法控制的服务。
-
您应该要求提供者将此垃圾修复为有效格式。如果你开始解析这些东西,它会变得更糟,并且提供者永远不会习惯有效的格式。特别是如果您为服务付费。
-
您的“json”示例似乎已损坏。 24
{和只有 23}括号。 -
我刚回来发现问题 ON HOLD,所以无法发布答案。我观察到如果我在 REVERSE ORDER 中处理文本行,这个问题会更容易解决。我的解决方案使用了四个正则表达式:'\}'、'(\".*?\")\s+(\".*\")'、'^\s*(\".*?\") (\s*)$', '^\{'