@@ -3,77 +3,47 @@ module Json where
4{-| Library for working with [JSON](https://en.wikipedia.org/wiki/JSON) values.
4{-| Library for working with [JSON](https://en.wikipedia.org/wiki/JSON) values.
10−@docs fromString, toString
6+@docs Value, fromString, toString
13−@docs fromJSString, toJSString
16−@docs fromJSObject, toJSObject
21import Dict
10import Dict
22import Maybe (Maybe)
11import Maybe (Maybe)
23−import JavaScript as JS
24import Native.Json
12import Native.Json
25−import JavaScript (JSObject, JSString)
27−{-| This datatype can represent all valid values that can be held in a JSON
14+{-| This datatype can represent all valid JSON values. A `Value` can be sent
28−object. In Elm, a proper JSON object is represented as a (Dict String Json)
15+through ports, and the runtime will do a conversion like this:
29−which is a mapping from strings to Json Values. -}
16+
17+ [2,'abc',null] == Array [Number 2, String "abc", Null]
19+JSON is an intentional subset of JavaScript values which excludes functions.
20+This ensures that impure functions cannot sneak into Elm through ports.
30−data Json
22+data Value
31 = String String
23 = String String
32 | Number Float
24 | Number Float
33 | Boolean Bool
25 | Boolean Bool
35− | Array [Json]
27+ | Array [Value]
36− | Object (Dict.Dict String Json)
28+ | Object (Dict.Dict String Value)
41−{-| Convert a `Json` into a prettified string.
31+{-| Convert a `Value` into a prettified string.
42The first argument is a separator token (e.g. \" \", \"\\n\", etc.) that will
32The first argument is a separator token (e.g. \" \", \"\\n\", etc.) that will
43−be used for indentation in the prettified string version of the JSON. -}
33+be used for indentation in the prettified string version of the JSON.
44−toString : String -> Json -> String
45−toString sep v = JS.toString (Native.Json.toJSString sep v)
47−{-| Convert a proper JSON object into a JavaScript string.
35+ toString "" Null == "null"
48−Note that the type JSString seen here is not the same as the type constructor
36+ toString "" (Number 4.0) == "4.0"
49−JsonString used elsewhere in this module. -}
37+-}
50−toJSString : String -> Json -> JSString
38+toString : String -> Value -> String
51−toJSString = Native.Json.toJSString
39+toString sep value = Native.Json.toString sep value
53{-| Parse a string representation of a proper JSON object into
41{-| Parse a string representation of a proper JSON object into
54−its Elm representation. -}
42+its Elm representation.
55−fromString : String -> Maybe Json
56−fromString s = Native.Json.fromJSString (JS.fromString s)
58−{-| Parse a JavaScript string representation of a proper JSON object into
59−its Elm representation. -}
60−fromJSString : JSString -> Maybe Json
61−fromJSString = Native.Json.fromJSString
63−{-| Convert a JS object into a `Json`. -}
64−fromJSObject : JSObject -> Json
65−fromJSObject = Native.Json.fromJSObject
67−{-| Convert a `Json` into a `JSObject`. Paired with the
68−[`JavaScript.Experimental` library](/docs/JavaScript/Experimental.elm),
69−This lets you convert strings into Elm records:
71− import JavaScript.Experimental as JS
73− stringToRecord str =
44+ fromString "null" == Just Null
74− case fromString str of
45+ fromString "[true,3]" == Just (Array [Boolean True, Number 3])
75− Just json -> Just (JS.toRecord (toJSObject json))
46+ fromString "{'abc':4}" == Just (Object (Dict.fromList [("abc", Number 4)]))
78−toJSObject : Json -> JSObject
48+fromString : String -> Maybe Value
79−toJSObject = Native.Json.toJSObject
49+fromString str = Native.Json.fromString str