| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\Iaso;
 
 use ParagonIE\Iaso\Contract\Blank;
 use ParagonIE\Iaso\Result\Bare;
 
 /**
 * Class JSON
 *
 * This is just an easy public API
 *
 * @package ParagonIE\Iaso
 */
 abstract class JSON
 {
 /**
 * @var string
 */
 protected static $seed;
 
 /**
 * @var Parser
 */
 protected static $parser;
 
 /**
 * @param string $json            Input data
 * @param Contract|null $contract Contract object for the parser
 * @param bool $asArray           Convert objects to arrays?
 * @return mixed
 */
 public static function parse(
 string $json,
 Contract $contract = null,
 bool $asArray = false
 ) {
 $parsed = isset($contract)
 ? static::parseWithContract($json, $contract)
 : static::parseString($json);
 
 if ($parsed instanceof Bare) {
 return $parsed->getBareValue();
 } elseif ($asArray) {
 return $parsed->asArray(true);
 }
 return $parsed;
 }
 
 /**
 * @param string $json
 * @return ResultSet
 */
 protected static function parseString(string $json = ''): ResultSet
 {
 $parser = static::getParser();
 return $parser->parse($json, new Blank);
 }
 
 /**
 * @param string $json
 * @param Contract $contract
 * @return ResultSet
 */
 protected static function parseWithContract(
 string $json,
 Contract $contract
 ): ResultSet {
 $parser = static::getParser();
 return $parser->parse($json, $contract);
 }
 
 /**
 * Overloadable method for getting the parser object we desire
 */
 public static function getParser(): Parser
 {
 if (!isset(self::$parser)) {
 self::$parser = new Parser;
 }
 return self::$parser;
 }
 
 /**
 * Get a unique random secret once per script execution
 *
 * @return string
 */
 public static function getSeed(): string
 {
 if (!self::$seed) {
 self::$seed = \random_bytes(
 \ParagonIE_Sodium_Compat::CRYPTO_SHORTHASH_KEYBYTES
 );
 }
 return self::$seed;
 }
 }
 
 |