Megosztás a következőn keresztül:


Karakterkódolás testreszabása System.Text.Json

Alapértelmezés szerint a szerializáló az összes nem ASCII-karaktert feloldja. Ez azt jelzi, hogy \uxxxx hol xxxx található a karakter Unicode-kódja. Ha például a Summary következő JSON tulajdonság cirill жаркоbetűsre van állítva, az WeatherForecast objektum szerializálva lesz az alábbi példában látható módon:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": "\u0436\u0430\u0440\u043A\u043E"
}

Nyelvi karakterkészletek szerializálása

Ha egy vagy több nyelv karakterkészletét anélkül szeretné szerializálni, hogy el szeretne menekülni, adja meg a Unicode-tartomány(ok) t a példány System.Text.Encodings.Web.JavaScriptEncoderlétrehozásakor, ahogyan az az alábbi példában látható:

using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
Imports System.Text.Encodings.Web
Imports System.Text.Json
Imports System.Text.Unicode
var options1 = new JsonSerializerOptions
{
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
    WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options1);
options = New JsonSerializerOptions With {
    .Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.Cyrillic),
    .WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)

Ez a kód nem menekül a cirill vagy görög karakterek elől. Ha a Summary tulajdonság cirill жаркоbetűsre van állítva, az WeatherForecast objektum szerializálva lesz az alábbi példában látható módon:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": "жарко"
}

Alapértelmezés szerint a kódoló inicializálva van a BasicLatin tartománnyal.

Ha az összes nyelvi készletet anélkül szeretné szerializálni, hogy menekülni szeretne, használja a következőt UnicodeRanges.All: .

Adott karakterek szerializálása

Másik lehetőségként megadhatja azokat az egyéni karaktereket, amelyeket át szeretne adni a feloldás nélkül. Az alábbi példa csak az első két karaktert szerializálja жарко:

using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
Imports System.Text.Encodings.Web
Imports System.Text.Json
Imports System.Text.Unicode
var encoderSettings = new TextEncoderSettings();
encoderSettings.AllowCharacters('\u0436', '\u0430');
encoderSettings.AllowRange(UnicodeRanges.BasicLatin);
var options2 = new JsonSerializerOptions
{
    Encoder = JavaScriptEncoder.Create(encoderSettings),
    WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options2);
Dim encoderSettings As TextEncoderSettings = New TextEncoderSettings
encoderSettings.AllowCharacters(ChrW(&H436), ChrW(&H430))
encoderSettings.AllowRange(UnicodeRanges.BasicLatin)
options = New JsonSerializerOptions With {
    .Encoder = JavaScriptEncoder.Create(encoderSettings),
    .WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)

Íme egy példa az előző kód által létrehozott JSON-ra:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 25,
  "Summary": "жа\u0440\u043A\u043E"
}

Listák blokkolása

Az előző szakaszok bemutatják, hogyan adható meg azoknak a kódpontoknak vagy tartományoknak a listája, amelyeket nem szeretne kihagyni. Vannak azonban globális és kódolóspecifikus blokklisták, amelyek felülírhatnak bizonyos kódpontokat az engedélyezési listában. A blokklisták kódpontjai mindig ki vannak tiltva, még akkor is, ha szerepelnek az engedélyezési listában.

Globális blokklista

A globális blokklista olyan elemeket tartalmaz, mint a magánhasználatú karakterek, a vezérlőkarakterek, a nem definiált kódpontok és bizonyos Unicode-kategóriák, például a Space_Separator kategória, kivéve U+0020 SPACE. A rendszer például akkor is elkerüli a kódot, U+3000 IDEOGRAPHIC SPACE ha engedélyezési listaként Unicode-tartomány CJK-szimbólumokat és írásjeleket (U+3000-U+303F) ad meg.

A globális blokklista egy implementálási részlet, amely a .NET minden kiadásában megváltozott. Ne függjön attól, hogy egy karakter a globális blokklista tagja (vagy nem tagja) legyen.

Kódolóspecifikus blokklisták

A kódoló-specifikus blokkolt kódpontok közé tartozik '<''&' például a HTML-kódoló, '\' a JSON-kódoló és '%' az URL-kódoló. A HTML-kódoló például mindig menekül az ampersands ('&') elől, annak ellenére, hogy az ampersand a BasicLatin tartományban van, és az összes kódoló alapértelmezés szerint inicializálva BasicLatin van.

Az összes karakter szerializálása

A menekülés minimalizálása érdekében használhatja JavaScriptEncoder.UnsafeRelaxedJsonEscapinga következő példában látható módon:

using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;
Imports System.Text.Encodings.Web
Imports System.Text.Json
Imports System.Text.Unicode
var options3 = new JsonSerializerOptions
{
    Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
    WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, options3);
options = New JsonSerializerOptions With {
    .Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
    .WriteIndented = True
}
jsonString = JsonSerializer.Serialize(weatherForecast1, options)

Figyelemfelhívás

Az alapértelmezett kódolóhoz képest a UnsafeRelaxedJsonEscaping kódoló megengedőbb, hogy lehetővé teszi a karakterek számára, hogy a kódolatlanokon áthaladjanak:

  • Nem szabadul fel a HTML-érzékeny karakterek, például <a , >, &és '.
  • Nem nyújt további részletes védelmet az XSS-sel vagy az információfeltárási támadásokkal szemben, például azokat, amelyek az ügyfél és a kiszolgáló által a karakterkészleten nem értünk egyet.

A nem biztonságos kódolót csak akkor használja, ha ismert, hogy az ügyfél az eredményül kapott hasznos adatokat UTF-8 kódolású JSON-ként értelmezi. Használhatja például, ha a kiszolgáló elküldi a válaszfejlécet Content-Type: application/json; charset=utf-8. Soha ne engedélyezze a nyers UnsafeRelaxedJsonEscaping kimenet HTML-lapba vagy elembe való kibocsátását <script> .

Lásd még