Битрикс JSON преобразовать в обычный JSON - PullRequest
0 голосов
/ 27 марта 2020

В Битриксе есть свой формат. Например, в поле b_events, поле СОБЫТИЯ: Данные там записаны примерно в таком виде:

a:7:{i:0;a:13:{s:2:"ID";s:7:"2611838";s:8:"OWNER_ID";s:3:"624";s:10:"CREATED_BY";s:3:"624";s:4:"NAME";s:111:"---";s:9:"DATE_FROM";s:19:"24.03.2020 09:30:00";s:7:"DATE_TO";s:19:"24.03.2020 10:00:00";s:9:"TIME_FROM";s:5:"09:30";s:7:"TIME_TO";s:5:"10:00";s:10:"IMPORTANCE";s:6:"normal";s:13:"ACCESSIBILITY";s:4:"busy";s:15:"DATE_FROM_TODAY";b:1;s:13:"DATE_TO_TODAY";b:1;s:4:"SORT";i:1585031400;}i:1;a:13:{s:2:"ID";s:7:"2611841";***

Для наглядности

a:7:{
i:0;a:13:{
  s:2: "ID";s:7: "2611838";
  s:8: "OWNER_ID";s:3: "624";
  s:10: "CREATED_BY";s:3: "624";
  s:4: "NAME";s:111: "---";
  s:9: "DATE_FROM";s:19: "24.03.2020 09:30:00";
  s:7: "DATE_TO";s:19: "24.03.2020 10:00:00";
  s:9: "TIME_FROM";s:5: "09:30";
  s:7: "TIME_TO";s:5: "10:00";
  s:10: "IMPORTANCE";s:6: "normal";
  s:13: "ACCESSIBILITY";s:4: "busy";
  s:15: "DATE_FROM_TODAY";b:1;
  s:13: "DATE_TO_TODAY";b:1;
  s:4: "SORT";i:1585031400;
}


i:1;a:13:{
  s:2:"ID";s:7:"2611841";
  ***
}

Как видно a: - указывает на длину массива; я: - индекс элемента массива; s: - длина строки.

Также есть сложность с последними полями

  s:15:"DATE_FROM_TODAY";b:1;
  s:13:"DATE_TO_TODAY";b:1;
  s:4:"SORT";i:1585031400;

Задача: преобразовать этот битрикс JSON >>> JSON

1 Ответ

0 голосов
/ 27 марта 2020

Версия 1 Преобразовывает в JSON все пары ключ => значение кроме

  s:15:"DATE_FROM_TODAY";b:1;
  s:13:"DATE_TO_TODAY";b:1;
  s:4:"SORT";i:1585031400;
function json_parse($json) {// invalid json parser
    $normal_json = "";
    $json = str_split($json);// str (invalid json) >>> array
    $arr_len = $json[0];
    $key = 0;

    while($json[$key] != "{"){
        $key++;
    };
    $key++;

    for($key = $key; $key < count($json) - 1; $key++) {
        $let = $json[$key];
        if($let == "a" && $json[$key+1] == ":"){// aray lengh

            $key = $key + 2;
            $value = "";

            while($json[$key] != ":"){
                    $value = $value.$json[$key];
                    $key++;
            }

        } elseif ($let == "s" && $json[$key+1] == ":") {// string lengh
            $key = $key + 2;
            $value = "";

            while($json[$key] != ":"){
                    $value = $value.$json[$key];
                    $key++;
            }

        } elseif ($let == "i" && $json[$key+1] == ":") {// i: >>> id array
            $key = $key + 2;
            $value = "";

            while($json[$key] != ";"){
                    $value = $value.$json[$key];
                    $key++;
            }
            if ($value < $arr_len) {

            } else {
                $key = $key - 2;
            }
        } elseif ($let == "}" || $let == "{") {// {}
            $normal_json = $normal_json.$let;

        } elseif ($let == ";" ) {// ; >>> ,
            $normal_json = $normal_json.", ";

        } elseif ($let == '"' ) {// "key":"value"
            $key++;
            $value = "";
                while ($json[$key] != '"') {
                    $value = $value.$json[$key];

                    $key++;
                }
                if($value == "SORT") {// skip
                    $key++;
                    continue;
                } elseif ($value == "DATE_FROM_TODAY" || $value == "DATE_TO_TODAY") {// skip
                    $key = $key + 5;
                    continue;
                }

                $value1 = $value.'" : "';
                $value = "";

                $key++;
                while ($json[$key] != '"') $key++;
                $key++;

                while ($json[$key] != '"') {
                    $value = $value. $json[$key];
                    $key++;
                };

                if ($value == "busy") $key++;
                $value = $value1.$value;
            $normal_json = $normal_json.'"'.$value.'"';
        }
    };

        return $normal_json;
}


function true_json($b_json) {
    $json_norm = str_split(json_parse($b_json));
    $json = "";


    for($key = 0; $key < count($json_norm); $key++) {
        $let = $json_norm[$key];

        if ($let == "}" && $json_norm[$key + 1] == "{") {
            $json = $json."},{";
            $key++;
        }
        else $json = $json.$let;
    }

    return "[".$json."]";
}


    var_dump(json_decode(true_json($b_json)));
...