Saltar al contenido

dotnet core System.Text.Json unescape cadena unicode

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:

ingrese la descripción de la imagen aquí

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *