on master help sign in
Trim out parts of API that are no longer useful
commita7bb27d793c04a3cad3ac9efeec58c44dbe9303f authorEvan Czaplicki <info@elm-lang.org> dateFri 21 Feb 2014, 18:04 (13 years ago) parentdc795ca
2 files changed+38−69
libraries/Json.elm+25−55 libraries/Native/Json.js+13−14
libraries/Json.elm+25−55
@@ -3,77 +3,47 @@ module Json where
33
44{-| Library for working with [JSON](https://en.wikipedia.org/wiki/JSON) values.
55
6−# Json Values
7−@docs Json
8−
9−# Strings
10−@docs fromString, toString
11−
12−# JS Strings
13−@docs fromJSString, toJSString
14−
15−# JS Objects
16−@docs fromJSObject, toJSObject
6+@docs Value, fromString, toString
177
188-}
199
20−import Basics (..)
2110import Dict
2211import Maybe (Maybe)
23−import JavaScript as JS
2412import Native.Json
25−import JavaScript (JSObject, JSString)
2613
27−{-| This datatype can represent all valid values that can be held in a JSON
28−object. In Elm, a proper JSON object is represented as a (Dict String Json)
29−which is a mapping from strings to Json Values. -}
30−data Json
14+{-| This datatype can represent all valid JSON values. A `Value` can be sent
15+through ports, and the runtime will do a conversion like this:
16+
17+ [2,'abc',null] == Array [Number 2, String "abc", Null]
18+
19+JSON is an intentional subset of JavaScript values which excludes functions.
20+This ensures that impure functions cannot sneak into Elm through ports.
21+-}
22+data Value
3123 = String String
3224 | Number Float
3325 | Boolean Bool
3426 | Null
35− | Array [Json]
36− | Object (Dict.Dict String Json)
27+ | Array [Value]
28+ | Object (Dict.Dict String Value)
3729
3830
39−-- String Converters
40−
41−{-| Convert a `Json` into a prettified string.
31+{-| Convert a `Value` into a prettified string.
4232The 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. -}
44−toString : String -> Json -> String
45−toString sep v = JS.toString (Native.Json.toJSString sep v)
33+be used for indentation in the prettified string version of the JSON.
4634
47−{-| Convert a proper JSON object into a JavaScript string.
48−Note that the type JSString seen here is not the same as the type constructor
49−JsonString used elsewhere in this module. -}
50−toJSString : String -> Json -> JSString
51−toJSString = Native.Json.toJSString
35+ toString "" Null == "null"
36+ toString "" (Number 4.0) == "4.0"
37+-}
38+toString : String -> Value -> String
39+toString sep value = Native.Json.toString sep value
5240
5341{-| Parse a string representation of a proper JSON object into
54−its Elm representation. -}
55−fromString : String -> Maybe Json
56−fromString s = Native.Json.fromJSString (JS.fromString s)
57−
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
62−
63−{-| Convert a JS object into a `Json`. -}
64−fromJSObject : JSObject -> Json
65−fromJSObject = Native.Json.fromJSObject
66−
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:
70−
71− import JavaScript.Experimental as JS
42+its Elm representation.
7243
73− stringToRecord str =
74− case fromString str of
75− Just json -> Just (JS.toRecord (toJSObject json))
76− Nothing -> Nothing
44+ fromString "null" == Just Null
45+ fromString "[true,3]" == Just (Array [Boolean True, Number 3])
46+ fromString "{'abc':4}" == Just (Object (Dict.fromList [("abc", Number 4)]))
7747-}
78−toJSObject : Json -> JSObject
79−toJSObject = Native.Json.toJSObject
48+fromString : String -> Maybe Value
49+fromString str = Native.Json.fromString str
libraries/Native/Json.js+13−14
@@ -15,11 +15,14 @@ Elm.Native.Json.make = function(elm) {
1515 switch (v.ctor) {
1616 case 'Null' : return null;
1717 case 'String' : return JS.fromString(v._0);
18+ case 'Number' : return v._0;
19+ case 'Boolean': return v._0;
1820 case 'Object' :
1921 var obj = {};
2022 var array = JS.fromList(Dict.toList(v._0));
2123 for (var i = array.length; i--; ) {
22− obj[JS.fromString(array[i]._0)] = fromValue(array[i]._1);
24+ var entry = array[i];
25+ obj[JS.fromString(entry._0)] = fromValue(entry._1);
2326 }
2427 return obj;
2528 case 'Array' :
@@ -28,20 +31,18 @@ Elm.Native.Json.make = function(elm) {
2831 array[i] = fromValue(array[i]);
2932 }
3033 return array;
31− default :
32− return v._0;
3334 }
3435 }
3536
36− function toPrettyJSString(sep, obj) {
37− return JSON.stringify(fromValue(obj), null, JS.fromString(sep));
37+ function toString(sep, value) {
38+ return JSON.stringify(fromValue(value), null, JS.fromString(sep));
3839 }
3940
4041 function toValue(v) {
4142 switch (typeof v) {
42− case 'string' : return { ctor:"String", _0: JS.toString(v) };
43− case 'number' : return { ctor:"Number", _0: JS.toFloat(v) };
44− case 'boolean': return { ctor:"Boolean" , _0: JS.toBool(v) };
43+ case 'string' : return { ctor:"String" , _0: JS.toString(v) };
44+ case 'number' : return { ctor:"Number" , _0: JS.toFloat(v) };
45+ case 'boolean': return { ctor:"Boolean", _0: JS.toBool(v) };
4546 case 'object' :
4647 if (v === null) return { ctor:"Null" };
4748 if (v instanceof Array) {
@@ -54,19 +55,17 @@ Elm.Native.Json.make = function(elm) {
5455 }
5556 }
5657
57− function fromJSString(str) {
58+ function fromString(str) {
5859 try {
59− return Maybe.Just(toValue(JSON.parse(str)));
60+ return Maybe.Just(toValue(JSON.parse(JS.fromString(str))));
6061 } catch (e) {
6162 return Maybe.Nothing;
6263 }
6364 }
6465
6566 return elm.Native.Json.values = {
66− toJSString : F2(toPrettyJSString),
67− fromJSString : fromJSString,
68− toJSObject : fromValue,
69− fromJSObject : toValue
67+ toString : F2(toString),
68+ fromString : fromString,
7069 };
7170
7271};