# HG changeset patch # User Michael Pavone # Date 1405825191 25200 # Node ID bb4723fec05e8bffc32993f14feeb823e12d2903 # Parent b74956a2196fa1ea59c9d4d73da232b1c3da54b7 Support for encoding objects, dictionaries, lists and arrays to JSON in json module diff -r b74956a2196f -r bb4723fec05e modules/array.tp --- a/modules/array.tp Fri Jul 18 20:45:50 2014 -0700 +++ b/modules/array.tp Sat Jul 19 19:59:51 2014 -0700 @@ -144,4 +144,9 @@ "" } } + + jsonEncode <- { + parts <- map: :el { json encode: el } + "[" . (parts join: ",") . "]" + } } diff -r b74956a2196f -r bb4723fec05e modules/dict.tp --- a/modules/dict.tp Fri Jul 18 20:45:50 2014 -0700 +++ b/modules/dict.tp Sat Jul 19 19:59:51 2014 -0700 @@ -1,4 +1,12 @@ { + _jsonEncode <- :dict { + parts <- #[] + foreach: dict :key val { + //TODO: escape field names + parts append: (key jsonEncode) . ":" . (json encode: val) + } + "{" . (parts join: ",") . "}" + } linearWithEls <- :els { key:val <- :k v { #{ @@ -77,6 +85,10 @@ } length <- { els length } + + jsonEncode <- { + _jsonEncode: self + } } } _empty <- #{ @@ -202,6 +214,10 @@ } } } + + jsonEncode <- { + _jsonEncode: self + } } } diff -r b74956a2196f -r bb4723fec05e modules/json.tp --- a/modules/json.tp Fri Jul 18 20:45:50 2014 -0700 +++ b/modules/json.tp Sat Jul 19 19:59:51 2014 -0700 @@ -163,5 +163,35 @@ decode <- :text { (_decode: text at: 0) value } + + encode <- :value { + if: (object does: value understand?: "jsonEncode") { + value jsonEncode + } else: { + toEncode <- #[] + if: (object does: value understand?: "serializeFields") { + toEncode <- value serializeFields + } else: { + toEncode <- object propertiesOf: value + } + parts <- #[] + foreach: toEncode :idx field { + fieldVal <- object sendMessage: field to: value + parts append: (field jsonEncode) . ":" . (encode: fieldVal) + } + "{" . (parts join: ",") . "}" + } + } + + main <- { + o <- #{ + foo <- "bar" + baz <- ["fizz" "buzz" "buzzzz"] + qux <- ((dict hash) set: "fo" "shizzle") set: "my" "nizzle" + arr <- #["pirate" "booty"] + } + print: (encode: o) . "\n" + 0 + } } } diff -r b74956a2196f -r bb4723fec05e modules/list.tp --- a/modules/list.tp Fri Jul 18 20:45:50 2014 -0700 +++ b/modules/list.tp Sat Jul 19 19:59:51 2014 -0700 @@ -14,6 +14,7 @@ contains? <- :val { false } string <- { "[]" } print <- { print: string } + jsonEncode <- { "[]" } } #{ empty <- { _empty } @@ -83,6 +84,11 @@ } print: "]" } + + jsonEncode <- { + parts <- map: :el { json encode: el } + "[" . (parts join: ",") . "]" + } } } } diff -r b74956a2196f -r bb4723fec05e modules/string.tp --- a/modules/string.tp Fri Jul 18 20:45:50 2014 -0700 +++ b/modules/string.tp Sat Jul 19 19:59:51 2014 -0700 @@ -310,6 +310,35 @@ } } + jsonEncode <- { + i <- 0 + start <- 0 + parts <- #["\""] + q <- "\"" byte: 0 + s <- "\\" byte: 0 + while: { i < byte_length } do: { + b <- byte: i + if: b = q { + parts append: (from: start withLength: i - start) + start <- i + 1 + parts append: "\\\"" + } else: { + if: b = s { + parts append: (from: start withLength: i - start) + start <- i + 1 + parts append: "\\\\" + } + } + + i <- i + 1 + } + if: start < byte_length { + parts append: (from: start) + } + parts append: "\"" + parts join: "" + } + isInteger? <- { false } isString? <- { true } isBasicString? <- { true }