Merge pull request #358 from urbit/i/342/update-json-for-zuse-413

update all en-json/de-json to en:json/de:json for %zuse 413
This commit is contained in:
tinnus-napbus 2023-05-10 11:09:10 +12:00 committed by GitHub
commit 28a7b13afa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 532 additions and 51 deletions

View File

@ -98,7 +98,7 @@ The system only handles pokes: there are no subscriptions or Arvo calls except
[302 ~ [%login-redirect './apps/feature']]
?~ body.request.inbound-request
[(send [405 ~ [%stock ~]]) state]
=/ json (de-json:html q.u.body.request.inbound-request)
=/ json (de:json:html q.u.body.request.inbound-request)
=/ action (dejs-action +.json)
(handle-action action)
::
@ -183,7 +183,7 @@ The most interesting part of the whole app is the `++handle-http` arm:
[302 ~ [%login-redirect './apps/feature']]
?~ body.request.inbound-request
[(send [405 ~ [%stock ~]]) state]
=/ json (de-json:html q.u.body.request.inbound-request)
=/ json (de:json:html q.u.body.request.inbound-request)
=/ action (dejs-action +.json)
(handle-action action)
::

View File

@ -335,7 +335,7 @@ The main app implements the logic for exposing and tracking data.
%'POST'
?~ body.request.inbound-request
[(send [405 ~ [%stock ~]]) this]
=/ json (de-json:html q.u.body.request.inbound-request)
=/ json (de:json:html q.u.body.request.inbound-request)
=/ axn `action`(dejs-action +.json)
(on-poke %flap-action !>(axn))
::
@ -848,7 +848,7 @@ With all of the above, you should have a working `%flappy` instance at `http://l
%'POST'
?~ body.request.inbound-request
[(send [405 ~ [%stock ~]]) this]
=/ json (de-json:html q.u.body.request.inbound-request)
=/ json (de:json:html q.u.body.request.inbound-request)
=/ axn `action`(dejs-action +.json)
(on-poke %flap-action !>(axn))
::
@ -1107,7 +1107,7 @@ If you examine `++on-poke` in `/app/flap.hoon`, you will see that HTTP `POST` re
%'POST'
?~ body.request.inbound-request
[(send [405 ~ [%stock ~]]) this]
=/ json (de-json:html q.u.body.request.inbound-request)
=/ json (de:json:html q.u.body.request.inbound-request)
=/ axn `action`(dejs-action +.json)
(on-poke %flap-action !>(axn))
```

View File

@ -10,8 +10,8 @@ Urbit represents JSON data with the `$json` structure (defined in `lull.hoon`).
JSON data on the web is encoded in text, so Urbit has two functions in `zuse.hoon` for dealing with this:
- [`+en-json:html`](/reference/hoon/zuse/2e_2-3#en-jsonhtml) - For printing `$json` to a text-encoded form.
- [`+de-json:html`](/reference/hoon/zuse/2e_2-3#de-jsonhtml) - For parsing text-encoded JSON to a `$json` structure.
- [`+en:json:html`](/reference/hoon/zuse/2e_2-3#enjsonhtml) - For printing `$json` to a text-encoded form.
- [`+de:json:html`](/reference/hoon/zuse/2e_2-3#dejsonhtml) - For parsing text-encoded JSON to a `$json` structure.
You typically want `$json` data converted to some other `noun` structure or vice versa, so Urbit has three collections of functions for this purpose, also in `zuse.hoon`:
@ -21,7 +21,7 @@ You typically want `$json` data converted to some other `noun` structure or vice
The relationship between these types and functions look like this:
![json diagram](https://media.urbit.org/docs/json-diagram.svg)
![json diagram](https://media.urbit.org/docs/json-diagram-v2.svg)
Note this diagram is a simplification - the `+dejs:format` and `+enjs:format` collections in particular are tools to be used in writing conversion functions rather than simply being used by themselves, but it demonstrates the basic relationships. Additionally, it is less common to do printing/parsing manually - this would typically be handled automatically by Eyre, though it may be necessary if you're retrieving JSON data via the web client vane Iris.
@ -157,10 +157,10 @@ Now we can try calling the `+to-js` function with our data to convert it to `$js
]
```
Let's also see how that `$json` would look as real JSON encoded in text. We can do that with `+en-json:html`:
Let's also see how that `$json` would look as real JSON encoded in text. We can do that with `+en:json:html`:
```
> (crip (en-json:html (to-js:user-lib usr)))
> (en:json:html (to-js:user-lib usr))
'{"joined":1631440078,"username":"john456","name":["John","William","Smith"],"email":"john.smith@example.com"}'
```
@ -281,13 +281,13 @@ Let's look at an example. Here's a gate that takes in some `$json`, decodes it w
Let's try it:
```
> +of-test (need (de-json:html '{"foo":"Hello"}'))
> +of-test (need (de:json:html '{"foo":"Hello"}'))
'Hello!!!'
> +of-test (need (de-json:html '{"bar":true}'))
> +of-test (need (de:json:html '{"bar":true}'))
'Yes'
> +of-test (need (de-json:html '{"baz":["a","b","c"]}'))
> +of-test (need (de:json:html '{"baz":["a","b","c"]}'))
'abc'
```
@ -322,13 +322,13 @@ Let's look at a practical example. Here's a generator you can save in the `%base
Let's try it:
```
> +ou-test (need (de-json:html '{"foo":"hello","bar":true,"baz":[1,2,3,4]}'))
> +ou-test (need (de:json:html '{"foo":"hello","bar":true,"baz":[1,2,3,4]}'))
['hello' %.y {1 2 3 4}]
> +ou-test (need (de-json:html '{"foo":"hello","bar":true}'))
> +ou-test (need (de:json:html '{"foo":"hello","bar":true}'))
['hello' %.y {}]
> +ou-test (need (de-json:html '{"foo":"hello"}'))
> +ou-test (need (de:json:html '{"foo":"hello"}'))
[%key 'bar']
dojo: hoon expression failed
```
@ -433,7 +433,7 @@ First, we'll save the code above as `user.hoon` in the `/mar` directory our of `
Let's quickly create a `$json` object to work with:
```
> =jon (need (de-json:html '{"joined":1631440078,"username":"john456","name":["John","William","Smith"],"email":"john.smith@example.com"}'))
> =jon (need (de:json:html '{"joined":1631440078,"username":"john456","name":["John","William","Smith"],"email":"john.smith@example.com"}'))
> jon
[ %o
p
@ -492,7 +492,7 @@ Let's test it out by giving it our `$user` data:
Finally, let's see how that looks as JSON encoded in text:
```
> (crip (en-json:html (user-to-json usr)))
> (en:json:html (user-to-json usr))
'{"joined":1631440078,"username":"john456","name":["John","William","Smith"],"email":"john.smith@example.com"}'
```

View File

@ -8,7 +8,7 @@ this section, we'll briefly look at how JSON works in Urbit, and write a library
to convert our agent's structures to and from JSON for our front-end.
JSON data comes into Eyre as a string, and Eyre parses it with the
[`++de-json:html`](/reference/hoon/zuse/2e_2-3#de-jsonhtml) function in
[`++de:json:html`](/reference/hoon/zuse/2e_2-3#dejsonhtml) function in
[`zuse.hoon`](/reference/hoon/zuse). The
hoon type it's parsed to is `$json`, which is defined as:
@ -29,7 +29,7 @@ agent (unless the mark specified is already `%json`, in which case it will be
delivered directly). Outbound facts will go through the same process in
reverse - converted from the agent's native mark to `$json`, then encoded in a
string by Eyre using
[`++en-json:html`](/reference/hoon/zuse/2e_2-3#en-jsonhtml) and delivered
[`++en:json:html`](/reference/hoon/zuse/2e_2-3#enjsonhtml) and delivered
to the web client. The basic flow for both inbound messages (pokes) and outbound
messages (facts and scry results) looks like this:
@ -171,7 +171,7 @@ complex nested `$json` decoding function can be built up in this manner.
For example:
```
> =js %- need %- de-json:html
> =js %- need %- de:json:html
'''
{
"foo": "hello",

View File

@ -15,12 +15,12 @@ The `desk` is the desk in which the thread resides. The `inputMark` is the `mark
When Spider receives an HTTP request, the following steps happen:
1. It converts the raw body of the message to `json` using `de-json:html`
1. It converts the raw body of the message to `json` using `de:json:html`
2. It creates a `tube:clay` (`mark` conversion gate) from `json` to whatever input `mark` you've specified and does the conversion.
3. It runs the specified thread and provides a `vase` of `(unit inputMark)` as the argument.
4. The thread does its thing and finally produces its result as a `vase` of `outputMark`.
5. Spider creates another `tube:clay` from the output `mark` to `json` and converts it.
6. It converts the `json` back into raw data suitable for the HTTP response body using `en-json:html`.
6. It converts the `json` back into raw data suitable for the HTTP response body using `en:json:html`.
7. Finally, it composes the HTTP response and passes it back to Eyre which passes it on to the client.
Thus, it's important to understand that the original HTTP request and final HTTP response must contain JSON data, and therefore the input & output `mark`s you specify must each have a `mark` file in `/mar` that includes a conversion method for `json -> inputMark` and `outputMark -> json` respectively.

View File

@ -342,7 +342,7 @@ A `json` object.
```
```
> (crip (en-json:html (frond:enjs:format 'foo' s+'bar')))
> (en:json:html (frond:enjs:format 'foo' s+'bar'))
'{"foo":"bar"}'
```
@ -377,7 +377,7 @@ A `json` object.
> =a ~[['foo' n+~.123] ['bar' s+'abc'] ['baz' b+&]]
> (pairs:enjs:format a)
[%o p={[p='bar' q=[%s p='abc']] [p='baz' q=[%b p=%.y]] [p='foo' q=[%n p=~.123]]}]
> (crip (en-json:html (pairs:enjs:format a)))
> (en:json:html (pairs:enjs:format a))
'{"foo":123,"baz":true,"bar":"abc"}'
```
@ -414,7 +414,7 @@ A `json` string.
```
```
> (crip (en-json:html (tape:enjs:format "foo")))
> (en:json:html (tape:enjs:format "foo"))
'"foo"'
```
@ -451,7 +451,7 @@ A `json` string.
```
```
> (crip (en-json:html (wall:enjs:format ~["foo" "bar" "baz"])))
> (en:json:html (wall:enjs:format ~["foo" "bar" "baz"]))
'"foo\\nbar\\nbaz\\n"'
```
@ -490,7 +490,7 @@ A `json` ~~string~~ number but with the `@p` rendered as text rather than a numb
```
```
> (crip (en-json:html (ship:enjs:format our)))
> (en:json:html (ship:enjs:format our))
'"zod"'
```
@ -537,7 +537,7 @@ A `json` number.
```
```
> (crip (en-json:html (numb:enjs:format 123)))
> (en:json:html (numb:enjs:format 123))
'123'
```
@ -573,7 +573,7 @@ A `json` number.
```
```
> (crip (en-json:html (sect:enjs:format now)))
> (en:json:html (sect:enjs:format now))
'1630407290'
```
@ -609,7 +609,7 @@ A `json` number.
```
```
> (crip (en-json:html (time:enjs:format now)))
> (en:json:html (time:enjs:format now))
'1630407462905'
```
@ -646,7 +646,7 @@ A `json` string.
```
```
> (crip (en-json:html (path:enjs:format /foo/bar/baz)))
> (en:json:html (path:enjs:format /foo/bar/baz))
'"/foo/bar/baz"'
```
@ -681,12 +681,12 @@ A `json` array of strings.
> =tan rose+[[" " "[" "]"] ~[leaf+"foo" leaf+"bar" leaf+"baz"]]
> (tank:enjs:format tan)
[%a p=~[[%s p='[foo bar baz]']]]
> (crip (en-json:html (tank:enjs:format tan)))
> (en:json:html (tank:enjs:format tan))
'["[foo bar baz]"]'
```
```
> =tan rose+[[" " "[" "]"] ~[leaf+"aaaaaaaaaaaaaaaaaaaaa" leaf+"bbbbbbbbbbbbbbbbbbb" leaf+"ccccccccccccccccccc" leaf+"dddddddddddddddddd"]]
> (crip (en-json:html (tank:enjs:format tan)))
> (en:json:html (tank:enjs:format tan))
'["[ aaaaaaaaaaaaaaaaaaaaa"," bbbbbbbbbbbbbbbbbbb"," ccccccccccccccccccc"," dddddddddddddddddd","]"]'
```

View File

@ -920,19 +920,19 @@ First, let's store some objects containing key-value pairs:
```
> =obj-1 o+(malt ['foo' s+'hello']~)
> (crip (en-json:html obj-1))
> (en:json:html obj-1)
'{"foo":"hello"}'
```
```
> =obj-2 o+(malt ~[['bar' a+~[n+'123' n+'456']]])
> (crip (en-json:html obj-2))
> (en:json:html obj-2)
'{"bar":[123,456]}'
```
```
> =obj-3 o+(malt ['baz' b+&]~)
> (crip (en-json:html obj-3))
> (en:json:html obj-3)
'{"baz":true}'
```
@ -1210,7 +1210,7 @@ A `(jug cord [type])`, where `[type]` is the type produced by `fist`.
#### Examples
```
> =jon (need (de-json:html '{"foo":["aaa","bbb","ccc"],"bar":["xxx","yyy","zzz"]}'))
> =jon (need (de:json:html '{"foo":["aaa","bbb","ccc"],"bar":["xxx","yyy","zzz"]}'))
> ((oj so):dejs:format jon)
{[p='bar' q={'xxx' 'zzz' 'yyy'}] [p='foo' q={'bbb' 'ccc' 'aaa'}]}
```
@ -1248,7 +1248,7 @@ A `(map cord [type])`, where `[type]` is the type produced by `wit`.
#### Examples
```
> =jon (need (de-json:html '{"foo":"aaa","bar":"bbb"}'))
> =jon (need (de:json:html '{"foo":"aaa","bar":"bbb"}'))
> ((om so):dejs:format jon)
{[p='bar' q='bbb'] [p='foo' q='aaa']}
```
@ -1290,7 +1290,7 @@ A `(map [a] [b])` where `[a]` is the type produced by `fel` and `[b]` is the typ
#### Examples
```
> =jon (need (de-json:html '{"123":"aaa","456":"bbb"}'))
> =jon (need (de:json:html '{"123":"aaa","456":"bbb"}'))
> ((op dem so):dejs:format jon)
{[p=456 q='bbb'] [p=123 q='aaa']}
```

View File

@ -617,16 +617,16 @@ A `(unit tank)`. The `unit` is `~` if decoding failed.
```
> =js-txt '{"rose":{"lines":[{"leaf":"foo"},{"leaf":"bar"},{"leaf":"baz"}],"style":{"mid":" ","close":"]","open":"["}}}'
> (dank:dejs-soft:format (need (de-json:html js-txt)))
> (dank:dejs-soft:format (need (de:json:html js-txt)))
[~ [%rose p=[p=" " q="[" r="]"] q=~[[%leaf p="foo"] [%leaf p="bar"] [%leaf p="baz"]]]]
> ~(ram re (need (dank:dejs-soft:format (need (de-json:html js-txt)))))
> ~(ram re (need (dank:dejs-soft:format (need (de:json:html js-txt)))))
"[foo bar baz]"
```
```
> (dank:dejs-soft:format (need (de-json:html '{"leaf":"foo"}')))
> (dank:dejs-soft:format (need (de:json:html '{"leaf":"foo"}')))
[~ [%leaf p="foo"]]
> ~(ram re (need (dank:dejs-soft:format (need (de-json:html '{"leaf":"foo"}')))))
> ~(ram re (need (dank:dejs-soft:format (need (de:json:html '{"leaf":"foo"}')))))
"foo"
```
@ -888,19 +888,19 @@ First, let's store some objects containing key-value pairs:
```
> =obj-1 o+(malt ['foo' s+'hello']~)
> (crip (en-json:html obj-1))
> (en:json:html obj-1)
'{"foo":"hello"}'
```
```
> =obj-2 o+(malt ~[['bar' a+~[n+'123' n+'456']]])
> (crip (en-json:html obj-2))
> (en:json:html obj-2)
'{"bar":[123,456]}'
```
```
> =obj-3 o+(malt ['baz' b+&]~)
> (crip (en-json:html obj-3))
> (en:json:html obj-3)
'{"baz":true}'
```
@ -1055,7 +1055,7 @@ A `(unit (map @t [type]))`, where `[type]` is the type produced by `wit`. The `u
#### Examples
```
> =jon (need (de-json:html '{"foo":"aaa","bar":"bbb"}'))
> =jon (need (de:json:html '{"foo":"aaa","bar":"bbb"}'))
> ((om so):dejs-soft:format jon)
[~ {[p='bar' q='bbb'] [p='foo' q='aaa']}]
```
@ -1102,7 +1102,7 @@ A `(unit (map [a] [b]))` where `[a]` is the type produced by `fel` and `[b]` is
#### Examples
```
> =jon (need (de-json:html '{"123":"aaa","456":"bbb"}'))
> =jon (need (de:json:html '{"123":"aaa","456":"bbb"}'))
> ((op dem so):dejs-soft:format jon)
[~ u={[p=456 q='bbb'] [p=123 q='aaa']}]
```

View File

@ -2,8 +2,29 @@
title = "2e(2-3): Print & Parse JSON"
weight = 50
[glossaryEntry."Print JSON"]
name = "Print JSON"
symbol = "en:json:html"
usage = "zuse"
slug = "#enjsonhtml"
desc = "Used in the Zuse library."
[glossaryEntry."Parse JSON"]
name = "Parse JSON"
symbol = "de:json:html"
usage = "zuse"
slug = "#dejsonhtml"
desc = "Used in the Zuse library."
[glossaryEntry."Parse JSON (deprecated)"]
name = "Parse JSON (deprecated)"
symbol = "de-json:html"
usage = "zuse"
slug = "#de-jsonhtml"
desc = "Used in the Zuse library."
[glossaryEntry."Print JSON (deprecated)"]
name = "Print JSON (deprecated)"
symbol = "en-json:html"
usage = "zuse"
slug = "#en-jsonhtml"
@ -11,10 +32,456 @@ desc = "Used in the Zuse library."
+++
## `++json:html`
Container core for JSON decoding/encoding functions.
### `++en:json:html`
Print json
Encode `jon`, a `json` structure, in a `cord`.
#### Accepts
`jon` is any `json`.
#### Produces
A `cord`.
#### Source
```hoon {% mode="collapse" %}
++ en :: encode JSON to tape
~% %en +>+ ~
|^ |= jon=^json
^- cord
(rap 3 (flop (onto jon ~)))
:: :: ++onto:en:json:html
++ onto
|= [val=^json out=(list @t)]
^+ out
?~ val ['null' out]
?- -.val
%a
?~ p.val ['[]' out]
=. out ['[' out]
!.
|- ^+ out
=. out ^$(val i.p.val)
?~(t.p.val [']' out] $(p.val t.p.val, out [',' out]))
::
%b
[?:(p.val 'true' 'false') out]
::
%n
[p.val out]
::
%s
[(scap p.val) out]
::
%o
=/ viz ~(tap by p.val)
?~ viz ['{}' out]
=. out ['{' out]
!.
|- ^+ out
=. out ^$(val q.i.viz, out [':' [(scap p.i.viz) out]])
?~(t.viz ['}' out] $(viz t.viz, out [',' out]))
==
:: :: ++scap:en:json:html
++ scap
|= val=@t
^- @t
=/ out=(list @t) ['"' ~]
=/ len (met 3 val)
=| [i=@ud pos=@ud]
|- ^- @t
?: =(len i)
(rap 3 (flop ['"' (rsh [3 pos] val) out]))
=/ car (cut 3 [i 1] val)
?: ?& (gth car 0x1f)
!=(car 0x22)
!=(car 0x5C)
!=(car 0x7F)
==
$(i +(i))
=/ cap
?+ car (crip '\\' 'u' ((x-co 4):co car))
%10 '\\n'
%'"' '\\"'
%'\\' '\\\\'
==
$(i +(i), pos +(i), out [cap (cut 3 [pos (sub i pos)] val) out])
-- ::en
```
#### Examples
```
> (en:json:html s+'foo')
'"foo"'
```
```
> (en:json:html o+(malt (limo ~[['foo' s+'xxx'] ['bar' n+'123'] ['baz' b+&]])))
'{"foo":"xxx","baz":true,"bar":123}'
```
---
### `++de:json:html`
Parse json
Decode `txt`, a `cord` of stringified JSON, to a `(unit json)` which is null if
parsing failed.
#### Accepts
`txt` is a `cord`.
#### Produces
A `(unit json)`.
#### Source
```hoon {% mode="collapse" %}
++ de :: parse cord to JSON
~% %de +>+ ~
|^ |= txt=cord
^- (unit ^json)
(rush txt apex)
:: :: ++abox:de-json:html
++ abox :: array
%+ stag %a
(ifix [sel (wish ser)] (more (wish com) apex))
:: :: ++apex:de-json:html
++ apex :: any value
%+ knee *^json |. ~+
%+ ifix [spac spac]
;~ pose
(cold ~ (jest 'null'))
(stag %b bool)
(stag %s stri)
(cook |=(s=tape [%n p=(rap 3 s)]) numb)
abox
obox
==
:: :: ++bool:de-json:html
++ bool :: boolean
;~ pose
(cold & (jest 'true'))
(cold | (jest 'false'))
==
:: :: ++esca:de-json:html
++ esca :: escaped character
;~ pfix bas
=* loo
=* lip
^- (list (pair @t @))
[b+8 t+9 n+10 f+12 r+13 ~]
=* wow
^~
^- (map @t @)
(malt lip)
(sear ~(get by wow) low)
;~(pose doq fas bas loo unic)
==
:: :: ++expo:de-json:html
++ expo :: exponent
;~ (comp weld)
(piec (mask "eE"))
(mayb (piec (mask "+-")))
(plus nud)
==
:: :: ++frac:de-json:html
++ frac :: fraction
;~(plug dot (plus nud))
:: :: ++jcha:de-json:html
++ jcha :: string character
;~(pose ;~(less doq bas (shim 32 255)) esca)
:: :: ++mayb:de-json:html
++ mayb :: optional
|*(bus=rule ;~(pose bus (easy ~)))
:: :: ++numb:de-json:html
++ numb :: number
;~ (comp weld)
(mayb (piec hep))
;~ pose
(piec (just '0'))
;~(plug (shim '1' '9') (star nud))
==
(mayb frac)
(mayb expo)
==
:: :: ++obje:de-json:html
++ obje :: object list
%+ ifix [(wish kel) (wish ker)]
(more (wish com) pear)
:: :: ++obox:de-json:html
++ obox :: object
(stag %o (cook malt obje))
:: :: ++pear:de-json:html
++ pear :: key-value
;~(plug ;~(sfix (wish stri) (wish col)) apex)
:: :: ++piec:de-json:html
++ piec :: listify
|* bus=rule
(cook |=(a=@ [a ~]) bus)
:: :: ++stri:de-json:html
++ stri :: string
%+ sear
|= a=cord
?. (sune a) ~
(some a)
(cook crip (ifix [doq doq] (star jcha)))
:: :: ++spac:de-json:html
++ spac :: whitespace
(star (mask [`@`9 `@`10 `@`13 ' ' ~]))
:: :: ++unic:de-json:html
++ unic :: escaped UTF16
=* lob 0x0
=* hsb 0xd800
=* lsb 0xdc00
=* hib 0xe000
=* hil 0x1.0000
|^
%+ cook
|= a=@
^- @t
(tuft a)
;~ pfix (just 'u')
;~(pose solo pair)
==
++ quad :: parse num from 4 hex
(bass 16 (stun [4 4] hit))
++ meat :: gen gate for sear:
|= [bot=@ux top=@ux flp=?] :: accept num in range,
|= sur=@ux :: optionally reduce
^- (unit @)
?. &((gte sur bot) (lth sur top))
~
%- some
?. flp sur
(sub sur bot)
++ solo :: single valid UTF16
;~ pose
(sear (meat lob hsb |) quad)
(sear (meat hib hil |) quad)
==
++ pair :: UTF16 surrogate pair
%+ cook
|= [hig=@ low=@]
^- @t
:(add hil low (lsh [1 5] hig))
;~ plug
(sear (meat hsb lsb &) quad)
;~ pfix (jest '\\u')
(sear (meat lsb hib &) quad)
==
==
--
:: :: ++utfe:de-json:html
++ utfe :: UTF-8 sequence
;~ less doq bas
=* qua
%+ cook
|= [a=@ b=@ c=@ d=@]
(rap 3 a b c d ~)
;~ pose
;~ plug
(shim 241 243)
(shim 128 191)
(shim 128 191)
(shim 128 191)
==
;~ plug
(just '\F0')
(shim 144 191)
(shim 128 191)
(shim 128 191)
==
;~ plug
(just '\F4')
(shim 128 143)
(shim 128 191)
(shim 128 191)
==
==
=* tre
%+ cook
|= [a=@ b=@ c=@]
(rap 3 a b c ~)
;~ pose
;~ plug
;~ pose
(shim 225 236)
(shim 238 239)
==
(shim 128 191)
(shim 128 191)
==
;~ plug
(just '\E0')
(shim 160 191)
(shim 128 191)
==
;~ plug
(just '\ED')
(shim 128 159)
(shim 128 191)
==
==
=* dos
%+ cook
|= [a=@ b=@]
(cat 3 a b)
;~ plug
(shim 194 223)
(shim 128 191)
==
;~(pose qua tre dos)
==
:: :: ++wish:de-json:html
++ wish :: with whitespace
|*(sef=rule ;~(pfix spac sef))
:: XX: These gates should be moved to hoon.hoon
:: :: ++sune:de-json:html
++ sune :: cord UTF-8 sanity
|= b=@t
^- ?
?: =(0 b) &
?. (sung b) |
$(b (rsh [3 (teff b)] b))
:: :: ++sung:de-json:html
++ sung :: char UTF-8 sanity
|^ |= b=@t
^- ?
=+ len=(teff b)
?: =(4 len) (quad b)
?: =(3 len) (tres b)
?: =(2 len) (dos b)
(lte (end 3 b) 127)
::
++ dos
|= b=@t
^- ?
=+ :- one=(cut 3 [0 1] b)
two=(cut 3 [1 1] b)
?& (rang one 194 223)
(cont two)
==
::
++ tres
|= b=@t
^- ?
=+ :+ one=(cut 3 [0 1] b)
two=(cut 3 [1 1] b)
tre=(cut 3 [2 1] b)
?&
?|
?& |((rang one 225 236) (rang one 238 239))
(cont two)
==
::
?& =(224 one)
(rang two 160 191)
==
::
?& =(237 one)
(rang two 128 159)
==
==
::
(cont tre)
==
::
++ quad
|= b=@t
^- ?
=+ :^ one=(cut 3 [0 1] b)
two=(cut 3 [1 1] b)
tre=(cut 3 [2 1] b)
for=(cut 3 [3 1] b)
?&
?|
?& (rang one 241 243)
(cont two)
==
::
?& =(240 one)
(rang two 144 191)
==
::
?& =(244 one)
(rang two 128 143)
==
==
::
(cont tre)
(cont for)
==
::
++ cont
|= a=@
^- ?
(rang a 128 191)
::
++ rang
|= [a=@ bot=@ top=@]
^- ?
?> (lte bot top)
&((gte a bot) (lte a top))
--
:: XX: This +teff should overwrite the existing +teff
:: :: ++teff:de-json:html
++ teff :: UTF-8 length
|= a=@t
^- @
=+ b=(end 3 a)
?: =(0 b)
?> =(`@`0 a) 0
?: (lte b 127) 1
?: (lte b 223) 2
?: (lte b 239) 3
4
-- ::de
```
#### Examples
```
> (de:json:html '"foo"')
[~ [%s p='foo']]
```
```
> (de:json:html '{"foo":"xxx","baz":true,"bar":123}')
[ ~
[ %o
p
[ n=[p='baz' q=[%b p=%.y]]
l=[n=[p='bar' q=[%n p=~.123]] l={} r={}]
r=[n=[p='foo' q=[%s p='xxx']] l={} r={}]
]
]
]
```
---
## `++en-json:html`
Print json
{% callout %}
**Deprecated:** use [`++en:json:html`](#enjsonhtml) instead.
{% callout %}
Encode `val`, a `json` structure, in a `tape`.
#### Accepts
@ -27,7 +494,12 @@ A `tape`.
#### Source
This is a very large function, refer to `zuse.hoon` for the source code.
```hoon
++ en-json
|= jon=^json
^- tape
(trip (en:json jon))
```
#### Examples
@ -47,6 +519,10 @@ This is a very large function, refer to `zuse.hoon` for the source code.
Parse json
{% callout %}
**Deprecated:** use [`++de:json:html`](#dejsonhtml) instead.
{% callout %}
Parse cord `a` to a `json` structure. The result is wrapped in a unit which is null if parsing failed.
#### Accepts
@ -59,7 +535,12 @@ A `(unit json)`. The `unit` is `~` if parsing failed.
#### Source
This is a very large function, refer to `zuse.hoon` for the source code.
```hoon
++ en-json
|= jon=^json
^- tape
(trip (en:json jon))
```
#### Examples