Solución:
Debe configurar las opciones de JsonSerializer para que no codifiquen esas cadenas.
JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
Luego pasa estas opciones cuando llama a su Serialize
método.
var s = JsonSerializer.Serialize(a, jso);
Código completo:
JsonSerializerOptions jso = new JsonSerializerOptions();
jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
var a = new A { Name = "你好" };
var s = JsonSerializer.Serialize(a, jso);
Console.WriteLine(s);
Resultado:
Si necesita imprimir el resultado en la consola, es posible que deba instalar un idioma adicional. Consulte aquí.
Para cambiar el comportamiento de escape del JsonSerializer
puedes pasar una costumbre JavascriptEncoder
al JsonSerializer
configurando el Encoder
propiedad en el JsonSerializerOptions
.
https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializeroptions.encoder?view=netcore-3.0#System_Text_Json_JsonSerializerOptions_Encoder
El comportamiento predeterminado está diseñado teniendo en cuenta la seguridad y el JsonSerializer
se escapa para una defensa en profundidad.
Si lo único que busca es escapar de ciertos caracteres “alfanuméricos” de un idioma no latino específico, le recomiendo que cree un JavascriptEncoder
utilizando el Create
método de fábrica en lugar de utilizar el UnsafeRelaxedJsonEscaping
codificador.
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs)
};
var a = new A { Name = "你好" };
var s = JsonSerializer.Serialize(a, options);
Console.WriteLine(s);
Hacerlo mantiene ciertas salvaguardas, por ejemplo, los caracteres sensibles a HTML seguirán escapando.
Yo advertiría contra el uso System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
con ligereza, ya que tiene un escape mínimo (por lo que tiene “inseguro” en el nombre). Si el JSON que está creando está escrito en un archivo codificado en UTF-8 en el disco o si es parte de una solicitud web que establece explícitamente el juego de caracteres en utf-8 (y no se va a incrustar potencialmente en un componente HTML tal como está), entonces probablemente esté bien usar esto.
Consulte la sección de comentarios en los documentos de la API: https://docs.microsoft.com/en-us/dotnet/api/system.text.encodings.web.javascriptencoder.unsaferelaxedjsonescaping?view=netcore-3.0#remarks
También podría considerar especificar UnicodeRanges.All
si espera / necesita que todos los idiomas permanezcan sin escape. Esto aún escapa a ciertos caracteres ASCII que son propensos a vulnerabilidades de seguridad.
JsonSerializerOptions options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
Para obtener más información y ejemplos de código, consulte: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?view=netcore-3.0#customize-character-encoding
Ver la nota de precaución