The hugo function jsonify
is escaping characters.
Test:
{{ $testDict := dict “<any-key>” “value”}}
{{ $testDict | jsonify }}
gives:
{"\u003cany-key\u003e":“value”}
Is this a bug with jsonify
or is there a hugo function I’m missing?
Any help would be appreciated, thanks!
1 Like
Have a look at safeJS
or the other safeX
functions.
I have the same issue as the original poster here, but I’m not sure how to apply the suggested solution of using safeJS
.
{{ $value := "<b>a thing</b>"}}
{{ $content := dict "key" $value }}
{{ $content.key }}
{{/* <b>a thing</b> */}}
{{ $content.key | jsonify }}
{{/* “\u003cb\u003ea thing\u003c/b\u003e” */}}
{{ $content.key | safeJS | jsonify }}
{{/* “\u003cb\u003ea thing\u003c/b\u003e” */}}
Thanks in advance for any help!
I’m running into this right now as well. I wonder if it’s a combination and order of these functions that will do the trick. I’ll report back if I can figure it out.
The thing to note here is, that this is about a KEY, not the values of JSON.
Could you provide a link to the JSON specification where special characters like that are allowed in KEYs? I never saw a key using other characters than a-z0-9-_.
Maybe there is a rule that no HTML is allowed in keys.
Also, look at the deeper issue here, why would anyone require HTML for a key? If that is something that is used for design, it should be handled in the layouts. If it’s to mark one specific collection of items (it’s a new item, make it red) then the structure should have a "new": true
in there and THAT should add the design.
jsonify
is doing what is right in my opinion. A key has a function: to tell us what the value is appointed to. And HTML has no right to live there IMHO
safeJSON
probably works in values with HTML.
This is a good point. I agree with your sentiment.
I didn’t read this well. I’m having the same problem as the OP, but with the value not the key.
I remember reading a post recently where the solution was to use safeJSON on the special character values, but NOT add extra "
around the value and then jsonify the whole thing. Not sure if that fits this issue.
Sorry to be slow responding, and thanks for your answer!
But in my example "<b>a thing</b>"
is the value. The key is "key"
:
{{ $value := "<b>a thing</b>"}}
{{ $content := dict "key" $value }}
{{ jsonify $content }}
produces:
{“key”:"\u003cb\u003ea thing\u003c/b\u003e"}
It’s not relevant since this is not a key, but from https://tools.ietf.org/html/rfc8259:
- Objects
An object structure is represented as a pair of curly brackets
surrounding zero or more name/value pairs (or members). A name is a
string. A single colon comes after each name, separating the name
from the value.
- Strings
The representation of strings is similar to conventions used in the C
family of programming languages. A string begins and ends with
quotation marks. All Unicode characters may be placed within the
quotation marks, except for the characters that MUST be escaped:
quotation mark, reverse solidus, and the control characters (U+0000
through U+001F).
But I do agree that including markup in keys would be pretty weird.
I’m afraid I don’t really understand this. Do you mean use safeJS
(not safeJSON
?) on "<b>a thing</b>"
, or just on the <
and >
characters somehow? And I’m not sure where I am adding the extra "
around the value.