json对象原始数据字段转换为php数组

时间:2020-07-01 05:49:31

标签: php json splunk

我从splunk中提取了JSON对象数据,其中一个字段 thumbnailPath = audioFunctions.songs[index].albumArtwork ?? 'assets/thumbnail.jpg'; title = audioFunctions.optimiseSongTitles(index) ?? title; author = audioFunctions.songs[index].artist ?? author; 包含一串数据,但是由于它的值不是有效的json字符串,因此我似乎无法使用以下命令将其转换为php数组 json_decode()

有什么想法可以将_raw的值转换为php数组吗?

这是我的json数据

_raw

想要像这样引用字符串中的每个值

{
    "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"
}

2 个答案:

答案 0 :(得分:2)

preg_match_all()foreach()的一种实现方式,

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

工作演示: https://3v4l.org/fFQSZ

答案 1 :(得分:1)

您可以使用preg_match_all()key="value"之后找到所有apache2:对。

$raw = $json_decode($json)->result->_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]);

演示〜https://3v4l.org/idlRs

相关问题