将json对象原始数据字段转换为php数组
我从splunk提取了一个JSON对象数据,其中一个字段将json对象原始数据字段转换为php数组,php,json,splunk,Php,Json,Splunk,我从splunk提取了一个JSON对象数据,其中一个字段\u raw包含一个数据字符串,但由于它的值不是有效的JSON字符串,我似乎无法使用JSON\u decode()将其转换为php数组 你知道如何将\u raw的值转换成php数组吗 这是我的json数据 { "result": { "_raw": "Jun 30 06:51:04 blablabla.com apache2: event_id="somet
\u raw
包含一个数据字符串,但由于它的值不是有效的JSON字符串,我似乎无法使用JSON\u decode()将其转换为php数组
你知道如何将\u raw
的值转换成php数组吗
这是我的json数据
{
"result": {
"_raw": "Jun 30 06:51:04 blablabla.com apache2: event_id="something" event="something" app="testapp" serial_number="066f1cda" revoke_reason="key compromise" revoke_comment="xxxxxx" delay_revoke="15" url="/blablabla.php" account_id="123456" user_id="xxxxxxx" staff_id="xxxx" staff_name="todd" ip_address="123.123.123.123"",
"splunk_server": "splunkin02.localhost.com"
},
"results_link": "https://splunk.sffew.com",
"app": "search",
"search_name": "TEST",
"owner": "toodles@sfsfe.com",
"sid": "scheduler_blahlahlah"
}
希望能够引用字符串中的每个值,如下所示
Array (
[event_id] => something
[event] => something
[app] => testapp
[serial_number] => 066f1cda
[revoke_reason] => key compromise
[revoke_comment] => xxxxxx
[delay_revoke] => 15
[url] => /blablabla.php
[account_id] => 123456
[user_id] => xxxxxxx
[staff_id] => xxxx
[staff_name] => todd
[ip_address] => 123.123.123.123
)
一种方法是
preg\u match\u all()
和foreach()
工作演示:一种方法
工作演示:您可以使用
preg\u match\u all()
在apache2:
之后查找所有key=“value”
对
$raw=$json\u decode($json)->result->\u raw;
$marker='apache2:';
$startAt=strpos($raw,$marker)+strlen($marker);
preg_match_all('/(\w+)=“(.*?/”,$raw,$matches,preg_PATTERN_ORDER,$startAt);
$result=array_combine($matches[1],$matches[2]);
演示~您可以使用
preg\u match\u all()
在apache2:
之后查找所有key=“value”
对
$raw=$json\u decode($json)->result->\u raw;
$marker='apache2:';
$startAt=strpos($raw,$marker)+strlen($marker);
preg_match_all('/(\w+)=“(.*?/”,$raw,$matches,preg_PATTERN_ORDER,$startAt);
$result=array_combine($matches[1],$matches[2]);
演示~如果它有助于我需要的关键字和值总是在单词
apache2
之后开始,请您澄清您的JSON是否实际有效?由于未转义\u raw
中的引号,您上面的内容无效,但我认为像Splunk这样的成熟工具不太可能生成无效的JSONI,如果它有助于我始终在单词apache2
后开始的键和值,请您澄清您的JSON是否实际有效?由于未转义\u raw
中的引号,上述内容无效,但我认为像Splunk这样的成熟工具不太可能生成无效的JSON。如果您没有手动修改此处的输入以使JSONString合法,OP的输入是什么not@RiggsFolly我假设OP的JSON实际上是有效的,因为它来自Splunk。我非常怀疑它是否会逃逸\u raw
值中的引号。如果您没有手动修改此处的输入以使JSONString合法,OP的输入就是合法的not@RiggsFolly我假设OP的JSON实际上是有效的,因为它来自Splunk。我非常怀疑它是否会在\u raw
值中转义引号
<?php
$re = '/"_raw": (.*)(?=,)/m';
$str = '{
"result": {
"_raw": "Jun 30 06:51:04 blablabla.com apache2: event_id="something" event="something" app="testapp" serial_number="066f1cda" revoke_reason="key compromise" revoke_comment="xxxxxx" delay_revoke="15" url="/blablabla.php" account_id="123456" user_id="xxxxxxx" staff_id="xxxx" staff_name="todd" ip_address="123.123.123.123"",
"splunk_server": "splunkin02.localhost.com"
},
"results_link": "https://splunk.sffew.com",
"app": "search",
"search_name": "TEST",
"owner": "toodles@sfsfe.com",
"sid": "scheduler_blahlahlah"
}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
$parsable_array = explode(' ',$matches[0][1]);
$expected_array = array_filter($parsable_array, function ($var) { return (stripos($var, '=') != false); });
$final_result = [];
foreach($expected_array as $str){
list($key,$value) = explode('=',$str);
$final_result[$key] = trim($value,'"');
}
print_r($final_result);
?>