xref: /template/strap/ComboStrap/Json.php (revision c3437056399326d621a01da73b649707fbb0ae69)
11fa8c418SNickeau<?php
21fa8c418SNickeau
31fa8c418SNickeau
41fa8c418SNickeaunamespace ComboStrap;
51fa8c418SNickeau
61fa8c418SNickeau
71fa8c418SNickeauclass Json
81fa8c418SNickeau{
91fa8c418SNickeau
10*c3437056SNickeau    const TYPE_OBJECT = "{";
11*c3437056SNickeau    const PARENT_TYPE_ARRAY = "[";
12*c3437056SNickeau    const TAB_SPACES_COUNTER = 4;
13*c3437056SNickeau    const EXTENSION = "json";
14*c3437056SNickeau
15*c3437056SNickeau    /**
16*c3437056SNickeau     * @var array
17*c3437056SNickeau     */
18*c3437056SNickeau    private $jsonArray;
19*c3437056SNickeau
20*c3437056SNickeau    /**
21*c3437056SNickeau     * Json constructor.
22*c3437056SNickeau     * @param array|null $jsonValue
23*c3437056SNickeau     */
24*c3437056SNickeau    public function __construct(?array $jsonValue = null)
251fa8c418SNickeau    {
26*c3437056SNickeau        $this->jsonArray = $jsonValue;
27*c3437056SNickeau
281fa8c418SNickeau    }
29*c3437056SNickeau
30*c3437056SNickeau    public static function createEmpty(): Json
31*c3437056SNickeau    {
32*c3437056SNickeau        return new Json([]);
33*c3437056SNickeau    }
34*c3437056SNickeau
35*c3437056SNickeau    public static function createFromArray(array $actual): Json
36*c3437056SNickeau    {
37*c3437056SNickeau        return new Json($actual);
38*c3437056SNickeau    }
39*c3437056SNickeau
40*c3437056SNickeau    public static function getValidationLink(string $json): string
41*c3437056SNickeau    {
42*c3437056SNickeau        return "See the errors it by clicking on <a href=\"https://jsonformatter.curiousconcept.com/?data=" . urlencode($json) . "\">this link</a>";
43*c3437056SNickeau    }
44*c3437056SNickeau
45*c3437056SNickeau    /**
46*c3437056SNickeau     * Used to make diff
47*c3437056SNickeau     * @return false|string
48*c3437056SNickeau     */
49*c3437056SNickeau    public function toNormalizedJsonString()
50*c3437056SNickeau    {
51*c3437056SNickeau        $jsonArray = $this->getJsonArray();
52*c3437056SNickeau        if ($jsonArray === null) {
53*c3437056SNickeau            /**
54*c3437056SNickeau             * Edge case empty string
55*c3437056SNickeau             */
56*c3437056SNickeau            return "";
57*c3437056SNickeau        }
58*c3437056SNickeau        return json_encode($jsonArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
59*c3437056SNickeau    }
60*c3437056SNickeau
61*c3437056SNickeau    /**
62*c3437056SNickeau     * This formatting make the object on one line for a list of object
63*c3437056SNickeau     * making the frontmatter compacter (one line, one meta)
64*c3437056SNickeau     * @return string
65*c3437056SNickeau     * @deprecated You should use the {@link MetadataFrontmatterStore::toFrontmatterJsonString()} instead
66*c3437056SNickeau     */
67*c3437056SNickeau    public function toFrontMatterFormat(): string
68*c3437056SNickeau    {
69*c3437056SNickeau
70*c3437056SNickeau        $jsonArray = $this->getJsonArray();
71*c3437056SNickeau        return MetadataFrontmatterStore::toFrontmatterJsonString($jsonArray);
72*c3437056SNickeau
73*c3437056SNickeau    }
74*c3437056SNickeau
75*c3437056SNickeau
76*c3437056SNickeau    /**
77*c3437056SNickeau     * @throws ExceptionCombo
78*c3437056SNickeau     */
79*c3437056SNickeau    public
80*c3437056SNickeau    static function createFromString($jsonString): Json
81*c3437056SNickeau    {
82*c3437056SNickeau        if($jsonString===null || $jsonString === "" ){
83*c3437056SNickeau            return new Json();
84*c3437056SNickeau        }
85*c3437056SNickeau        $jsonArray = json_decode($jsonString, true);
86*c3437056SNickeau        if ($jsonArray === null) {
87*c3437056SNickeau            throw new ExceptionCombo("The string is not a valid json. Value: ($jsonString)");
88*c3437056SNickeau        }
89*c3437056SNickeau        return new Json($jsonArray);
90*c3437056SNickeau    }
91*c3437056SNickeau
92*c3437056SNickeau    /**
93*c3437056SNickeau     * @return mixed
94*c3437056SNickeau     */
95*c3437056SNickeau    public
96*c3437056SNickeau    function toJsonObject()
97*c3437056SNickeau    {
98*c3437056SNickeau        $jsonString = $this->getJsonString();
99*c3437056SNickeau        return json_decode($jsonString);
100*c3437056SNickeau
101*c3437056SNickeau    }
102*c3437056SNickeau
103*c3437056SNickeau    public
104*c3437056SNickeau    function toArray(): ?array
105*c3437056SNickeau    {
106*c3437056SNickeau        return $this->getJsonArray();
107*c3437056SNickeau
108*c3437056SNickeau    }
109*c3437056SNickeau
110*c3437056SNickeau    public
111*c3437056SNickeau    function toPrettyJsonString()
112*c3437056SNickeau    {
113*c3437056SNickeau        return $this->toNormalizedJsonString();
114*c3437056SNickeau    }
115*c3437056SNickeau
116*c3437056SNickeau    private
117*c3437056SNickeau    function getJsonString()
118*c3437056SNickeau    {
119*c3437056SNickeau        return  json_encode($this->jsonArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
120*c3437056SNickeau    }
121*c3437056SNickeau
122*c3437056SNickeau    /**
123*c3437056SNickeau     * @return array|null
124*c3437056SNickeau     */
125*c3437056SNickeau    private
126*c3437056SNickeau    function getJsonArray(): ?array
127*c3437056SNickeau    {
128*c3437056SNickeau        return $this->jsonArray;
129*c3437056SNickeau    }
130*c3437056SNickeau
131*c3437056SNickeau    public
132*c3437056SNickeau    function toMinifiedJsonString()
133*c3437056SNickeau    {
134*c3437056SNickeau        return json_encode($this->jsonArray);
135*c3437056SNickeau    }
136*c3437056SNickeau
137*c3437056SNickeau
1381fa8c418SNickeau}
139