summaryrefslogtreecommitdiffstats
path: root/library/Director/Data/Json.php
blob: 78b3e67405e0ea26a14e1eaa2f16c7b81368eb3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php

namespace Icinga\Module\Director\Data;

use Icinga\Module\Director\Exception\JsonEncodeException;
use function json_decode;
use function json_encode;
use function json_last_error;

class Json
{
    const DEFAULT_FLAGS = JSON_PRESERVE_ZERO_FRACTION | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;

    /**
     * Encode with well-known flags, as we require the result to be reproducible
     *
     * @param $mixed
     * @param int|null $flags
     * @return string
     * @throws JsonEncodeException
     */
    public static function encode($mixed, $flags = null)
    {
        if ($flags === null) {
            $flags = self::DEFAULT_FLAGS;
        } else {
            $flags = self::DEFAULT_FLAGS | $flags;
        }
        $result = json_encode($mixed, $flags);

        if ($result === false && json_last_error() !== JSON_ERROR_NONE) {
            throw JsonEncodeException::forLastJsonError();
        }

        return $result;
    }

    /**
     * Decode the given JSON string and make sure we get a meaningful Exception
     *
     * @param string $string
     * @return mixed
     * @throws JsonEncodeException
     */
    public static function decode($string)
    {
        $result = json_decode($string);

        if ($result === null && json_last_error() !== JSON_ERROR_NONE) {
            throw JsonEncodeException::forLastJsonError();
        }

        return $result;
    }

    /**
     * @param $string
     * @return ?string
     * @throws JsonEncodeException
     */
    public static function decodeOptional($string)
    {
        if ($string === null) {
            return null;
        }

        return static::decode($string);
    }
}