Usar JsonSerializer.Serialize(obj) producirá una cadena con escape, pero quiero la versión sin escape. Por ejemplo:
using System; using System.Text.Json; public class Program { public static void Main() { var a = new A{Name = "你好"}; var s = JsonSerializer.Serialize(a); Console.WriteLine(s); } } class A { public string Name {get; set;} } producirá una cadena {"Name":"\u4F60\u597D"} pero quiero {"Name":"你好"}
Creé un fragmento de código en https://dotnetfiddle.net/w73vnO
Por favor, ayúdame.
Puede usar: System.Text.RegularExpressions.Regex.Unescape(string) para recuperar los caracteres Unicode. https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.unescape
Ejemplo de actualización de la pregunta original:
using System; using System.Text.Json; public class Program { public static void Main() { var a = new A{Name = "你好"}; var s = JsonSerializer.Serialize(a); var unescaped = System.Text.RegularExpressions.Regex.Unescape(s); Console.WriteLine(s); Console.WriteLine(unescaped); } } class A { public string Name {get; set;} }Producción:
{"Name":"\u4F60\u597D"} {"Name":"你好"}Utilizar:
JsonSerializerOptions options = new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) };Debe configurar las opciones de JsonSerializer para no codificar esas cadenas.
JsonSerializerOptions jso = new JsonSerializerOptions(); jso.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping; Luego pasa estas opciones cuando llama a su método Serialize .
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 de JsonSerializer , puede pasar un JavascriptEncoder personalizado a JsonSerializer configurando la propiedad Encoder en JsonSerializerOptions .
El comportamiento predeterminado está diseñado teniendo en cuenta la seguridad y JsonSerializer se escapa para una defensa en profundidad.
Si todo lo que está buscando es escapar de ciertos caracteres "alfanuméricos" de un idioma no latino específico, le recomendaría que, en su lugar, cree un JavascriptEncoder usando el método Create factory en lugar de usar el codificador UnsafeRelaxedJsonEscaping .
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);Si lo hace, mantiene ciertas salvaguardas, por ejemplo, los caracteres sensibles a HTML seguirán siendo escapados.
Yo advertiría contra el uso de System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping con ligereza ya que hace un escape mínimo (por eso 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 conjunto de caracteres en utf-8 (y no se va a incrustar potencialmente en un componente HTML tal cual), entonces probablemente esté bien usar esto.
Consulte la sección de comentarios dentro de 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 escapar. 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