Is there a way to not escape slashes when parsing JSON?

bachmeier no at spam.net
Mon Feb 21 17:50:56 UTC 2022


On Monday, 21 February 2022 at 17:32:23 UTC, bachmeier wrote:
> On Monday, 21 February 2022 at 04:02:23 UTC, Steven 
> Schveighoffer wrote:
>> On Monday, 21 February 2022 at 03:42:55 UTC, bachmeier wrote:
>>> I tried this
>>>
>>> ```d
>>> import std.json, std.stdio;
>>>
>>> void main() {
>>>     writeln(parseJSON(`{"a": "path/file"}`, 
>>> JSONOptions.doNotEscapeSlashes));
>>> }
>>> ```
>>>
>>> but the output is
>>>
>>> ```
>>> {"a":"path\/file"}
>>> ```
>>>
>>> Is there a way to avoid the escaping of the forward slash? Is 
>>> there some reason I should want to escape the forward slash?
>>
>> The options are applied on parsing or output but do not stay 
>> with the item! So just because you parsed without allowing 
>> escapes on slashes doesn't mean the output will use that 
>> option.
>>
>> 2 ways I found:
>>
>> ```d
>> // 1. allocate a string to display
>> writeln(parseJson(...).toString(JSONOptions.doNotEscapeSlashes));
>> // 2. wrap so you can hook the output range version of toString
>> struct NoEscapeJson
>> {
>>     JSONValue json;
>>     void toString(Out)(Out outputrange) const
>>     {
>>         json.toString(outputrange, 
>> JSONOptions.doNotEscapeSlashes);
>>     }
>> }
>> writeln(NoEscapeJson(parseJson(...)));
>> ```
>>
>> -Steve
>
> I've had a chance to look into this. The documentation for 
> `parseJSON` says:
>
> ```
> JSONOptions options 	enable decoding string representations of 
> NaN/Inf as float values
> ```
>
> which looks to me as if there's no way to apply 
> `doNotEscapeSlashes` while parsing. Your approach works if the 
> goal is to print out the JSON as it was passed in. I don't see 
> any way to work with the parsed JSON data. If I want to later 
> work with element "a" and do something with "path/file", the 
> value will always be "path\/file". AFAICT, I'd have to manually 
> unescape every element.

I looked at the source for `parseJSON` and I see references only 
to `JSONOptions.strictParsing` and 
`JSONOptions.specialFloatLiterals`. I may be missing something, 
but I don't see any option to iterating over every element and 
unescaping manually.


More information about the Digitalmars-d-learn mailing list