/**
 * Кодирует объект в формат JSON
 *
 * @param     $Value   Значение, которое будет закодировано. Может быть любого типа за исключением resource.
 * @param int $Options Битовая маска составляемая из значений JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE.
 * @return string
 * @since 1.3.5
 */
function JsonEncode($Value, $Options = 0)
{
    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
        return json_encode(ObjectCp1251ToUtf8($Value), $Options);
    } else {
        return json_encode(ObjectCp1251ToUtf8($Value));
    }
}
function ParseAnnotations($DocComment)
{
    preg_match_all('/@([a-zA-Z0-9_-]+)\\:(.+)/', $DocComment, $parsed);
    $annotations = array();
    foreach ($parsed[1] as $i => $Name) {
        $annotations[] = '"' . $Name . '": ' . $parsed[2][$i];
    }
    $Json = '{' . implode(',', ObjectCp1251ToUtf8($annotations)) . '}';
    return JsonDecode($Json);
}
/**
 * Преобразует строки объекта или массива в кодировку UTF-8
 * @param  $var
 * @return array|string
 * @since 1.3.5
 */
function ObjectCp1251ToUtf8(&$var)
{
    if (is_array($var)) {
        foreach ($var as &$v) {
            $v = ObjectCp1251ToUtf8($v);
        }
    } elseif (is_object($var)) {
        $vars = get_object_vars($var);
        foreach ($vars as $f => &$v) {
            $var->{$f} = ObjectCp1251ToUtf8($v);
        }
    } elseif (is_string($var)) {
        $var = Cp1251ToUtf8($var);
    }
    return $var;
}