Open ajcvickers opened 10 months ago
related: #30315
Here's the relevant docs page on encoding/escaping in System.Text.Json; we may want to specify JavaScriptEncoder.UnsafeRelaxedJsonEscaping.
However, for people using non-Unicode encodings in the database, or wanting to interact with the JSON documents from other tools which may not support special chars, we should probably have some sort of mechanism for specifying the encoding/escaping policy; this basically boils down to allowing users to specify the JsonSerializerOptions (which has this one it).
Maybe it makes sense to keep the current behavior as the default (as that's the S.T.Json default), and just tell people to specify UnsafeRelaxedJsonEscaping via JsonSerializerOptions if they want unescaped chars.
related: https://github.com/dotnet/efcore/issues/33443
We also escape all unicode chars in JSON property names, however when building a JSON path for query or update we don't escape those chars. This leads to us not fetching/updating the requested JSON fragments
Note that we'd need to not escape - and deal with non-escaped JSON data - everywhere in our stack (SaveChanges, JSON path generation, shaper - see #33771.
As in https://github.com/dotnet/efcore/pull/33771#pullrequestreview-2092452772, we should consider doing this for 9.0 as well, since #33771 is a breaking change for people querying externally-inputted JSON data that isn't escaped.
Note for the implementer: (as pointed out by @Charlieface here: https://github.com/dotnet/efcore/issues/33443#issuecomment-2140160687) when we allow un-escaped JSON strings, we need to escape single and double quotes and also pre-pend N to the JSON path string.
Design discussion:
The JSON stored in a SQL Server column always has its Unicode characters escaped. For example, this code:
Results in the following JSON in the database:
However, there is nothing preventing the JSON being stored as:
EF reads the correct string back in both cases, but other tools may not be expecting escaped JSON for all Unicode characters.
Test code: