-
Notifications
You must be signed in to change notification settings - Fork 39
Closed
Description
Quote(") in string is supported in fromJson(), but not in toJson().
var s = """ "quote\"inside" """
var v = s.fromJson(string)
echo v
echo v.toJson.fromJson(string)Output:
quote"inside
quote
Fix:
proc dumpHook*(s: var string, v: string) =
when nimvm:
s.add '"'
for c in v:
case c:
of '\\': s.add r"\\"
of '\b': s.add r"\b"
of '\f': s.add r"\f"
of '\n': s.add r"\n"
of '\r': s.add r"\r"
of '\t': s.add r"\t"
of '"': s.add r"\"""
else:
s.add c
s.add '"'
else:
# Its faster to grow the string only once.
# Then fill the string with pointers.
# Then cap it off to right length.
var at = s.len
s.setLen(s.len + v.len*2+2)
var ss = cast[ptr UncheckedArray[char]](s[0].addr)
template add(ss: ptr UncheckedArray[char], c: char) =
ss[at] = c
inc at
template add(ss: ptr UncheckedArray[char], c1, c2: char) =
ss[at] = c1
inc at
ss[at] = c2
inc at
ss.add '"'
for c in v:
case c:
of '\\': ss.add '\\', '\\'
of '\b': ss.add '\\', 'b'
of '\f': ss.add '\\', 'f'
of '\n': ss.add '\\', 'n'
of '\r': ss.add '\\', 'r'
of '\t': ss.add '\\', 't'
of '"': ss.add '\\', '"'
else:
ss.add c
ss.add '"'
s.setLen(at)Output:
quote"inside
quote"inside
pietroppeter
Metadata
Metadata
Assignees
Labels
No labels