mirror of https://github.com/flightphp/core
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							115 lines
						
					
					
						
							3.3 KiB
						
					
					
				
			
		
		
	
	
							115 lines
						
					
					
						
							3.3 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace flight\util;
 | 
						|
 | 
						|
use Exception;
 | 
						|
use JsonException;
 | 
						|
 | 
						|
/**
 | 
						|
 * Json utility class for encoding and decoding JSON data.
 | 
						|
 *
 | 
						|
 * This class provides centralized JSON handling for the FlightPHP framework,
 | 
						|
 * with consistent error handling and default options.
 | 
						|
 */
 | 
						|
class Json
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Default JSON encoding options
 | 
						|
     */
 | 
						|
    public const DEFAULT_ENCODE_OPTIONS = JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Default JSON decoding options
 | 
						|
     */
 | 
						|
    public const DEFAULT_DECODE_OPTIONS = JSON_THROW_ON_ERROR;
 | 
						|
 | 
						|
    /**
 | 
						|
     * Encodes data to JSON string.
 | 
						|
     *
 | 
						|
     * @param mixed $data Data to encode
 | 
						|
     * @param int $options JSON encoding options (bitmask)
 | 
						|
     * @param int $depth Maximum depth
 | 
						|
     *
 | 
						|
     * @return string JSON encoded string
 | 
						|
     * @throws Exception If encoding fails
 | 
						|
     */
 | 
						|
    public static function encode($data, int $options = 0, int $depth = 512): string
 | 
						|
    {
 | 
						|
        $options = $options | self::DEFAULT_ENCODE_OPTIONS; // Ensure default options are applied
 | 
						|
        try {
 | 
						|
            return json_encode($data, $options, $depth);
 | 
						|
        } catch (JsonException $e) {
 | 
						|
            throw new Exception('JSON encoding failed: ' . $e->getMessage(), $e->getCode(), $e);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Decodes JSON string to PHP data.
 | 
						|
     *
 | 
						|
     * @param string $json JSON string to decode
 | 
						|
     * @param bool $associative Whether to return associative arrays instead of objects
 | 
						|
     * @param int $depth Maximum decoding depth
 | 
						|
     * @param int $options JSON decoding options (bitmask)
 | 
						|
     *
 | 
						|
     * @return mixed Decoded data
 | 
						|
     * @throws Exception If decoding fails
 | 
						|
     */
 | 
						|
    public static function decode(string $json, bool $associative = false, int $depth = 512, int $options = 0)
 | 
						|
    {
 | 
						|
        $options = $options | self::DEFAULT_DECODE_OPTIONS; // Ensure default options are applied
 | 
						|
        try {
 | 
						|
            return json_decode($json, $associative, $depth, $options);
 | 
						|
        } catch (JsonException $e) {
 | 
						|
            throw new Exception('JSON decoding failed: ' . $e->getMessage(), $e->getCode(), $e);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Checks if a string is valid JSON.
 | 
						|
     *
 | 
						|
     * @param string $json String to validate
 | 
						|
     *
 | 
						|
     * @return bool True if valid JSON, false otherwise
 | 
						|
     */
 | 
						|
    public static function isValid(string $json): bool
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            json_decode($json, false, 512, JSON_THROW_ON_ERROR);
 | 
						|
            return true;
 | 
						|
        } catch (JsonException $e) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the last JSON error message.
 | 
						|
     *
 | 
						|
     * @return string Error message or empty string if no error
 | 
						|
     */
 | 
						|
    public static function getLastError(): string
 | 
						|
    {
 | 
						|
        $error = json_last_error();
 | 
						|
        if ($error === JSON_ERROR_NONE) {
 | 
						|
            return '';
 | 
						|
        }
 | 
						|
        return json_last_error_msg();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Pretty prints JSON data.
 | 
						|
     *
 | 
						|
     * @param mixed $data Data to encode
 | 
						|
     * @param int $additionalOptions Additional options to merge with pretty print
 | 
						|
     *
 | 
						|
     * @return string Pretty formatted JSON string
 | 
						|
     * @throws Exception If encoding fails
 | 
						|
     */
 | 
						|
    public static function prettyPrint($data, int $additionalOptions = 0): string
 | 
						|
    {
 | 
						|
        $options = self::DEFAULT_ENCODE_OPTIONS | JSON_PRETTY_PRINT | $additionalOptions;
 | 
						|
        return self::encode($data, $options);
 | 
						|
    }
 | 
						|
}
 |