diff options
author | majorseitan@blockfreie.org <majorseitan@blockfreie.org> | 2018-04-14 21:56:09 -0400 |
---|---|---|
committer | majorseitan@blockfreie.org <majorseitan@blockfreie.org> | 2018-04-14 22:00:10 -0400 |
commit | 2bc51bd866b52bc738f259ffe6e9fb8f6068a6b6 (patch) | |
tree | df350f2ffd18c9848e4679243de395ae42d2b957 | |
parent | 0cadb1a719bc515af2449ac966e545a6599aee4d (diff) |
Handling of JSON escape characters
1. Handle escape sequence chars
\t \n \r
2. Fail on unsupported escape characters.
Instead of skipping \ on unsupported
sequences it now fails.
-rw-r--r-- | lib/ur/json.ur | 22 | ||||
-rw-r--r-- | tests/jsonTest.ur | 1 |
2 files changed, 18 insertions, 5 deletions
diff --git a/lib/ur/json.ur b/lib/ur/json.ur index 9288a6dd..1e3e3f39 100644 --- a/lib/ur/json.ur +++ b/lib/ur/json.ur @@ -46,10 +46,14 @@ fun escape s = let val ch = String.sub s 0 in - (if ch = #"\"" || ch = #"\\" then - "\\" ^ String.str ch - else - String.str ch) ^ esc (String.suffix s 1) + (case ch of + #"\n" => "\\n" + | #"\r" => "\\r" + | #"\t" => "\\t" + | #"\"" => "\\\"" + | #"\'" => "\\\'" + | x => String.str ch + ) ^ esc (String.suffix s 1) end in "\"" ^ esc s @@ -90,7 +94,15 @@ fun unescape s = if i+1 >= len then error <xml>JSON unescape: Bad escape sequence: {[s]}</xml> else - String.str (String.sub s (i+1)) ^ unesc (i+2) + (case String.sub s (i+1) of + #"n" => "\n" + | #"r" => "\r" + | #"t" => "\t" + | #"\"" => "\"" + | #"\'" => "\'" + | x => error <xml>JSON unescape: Bad escape char: {[x]}</xml>) + ^ + unesc (i+2) | _ => String.str ch ^ unesc (i+1) end in diff --git a/tests/jsonTest.ur b/tests/jsonTest.ur index 97898de8..1be6e7b5 100644 --- a/tests/jsonTest.ur +++ b/tests/jsonTest.ur @@ -1,6 +1,7 @@ open Json fun main () : transaction page = return <xml><body> + <pre>{[ fromJson "\"line 1\\nline 2\"" : string ]}</pre><br/> {[fromJson "[1, 2, 3]" : list int]}<br/> {[toJson ("hi" :: "bye\"" :: "hehe" :: [])]} </body></xml> |