Aracılığıyla paylaş


Taşma JSON'ını işleme veya içinde JsonElement veya JsonNode kullanma System.Text.Json

Bu makalede, taşma JSON'unun ad alanıyla nasıl işleneceğini System.Text.Json gösterir. Ayrıca, hedef türün seri durumdan JsonElement çıkarılmakta olan tüm JSON ile mükemmel eşleşmeyebileceği diğer senaryolara alternatif olarak veya JsonNodeolarak seri durumdan nasıl çıkarıldığını gösterir.

Sap taşması JSON’ı

Seri durumdan çıkarırken JSON'da hedef türün özellikleriyle temsil edilmeyen veriler alabilirsiniz. Örneğin, hedef türünüzün şu olduğunu varsayalım:

public class WeatherForecast
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string? Summary { get; set; }
}
Public Class WeatherForecast
    Public Property [Date] As DateTimeOffset
    Public Property TemperatureCelsius As Integer
    Public Property Summary As String
End Class

Seri durumdan çıkarılacak JSON şudur:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "temperatureCelsius": 25,
  "Summary": "Hot",
  "DatesAvailable": [
    "2019-08-01T00:00:00-07:00",
    "2019-08-02T00:00:00-07:00"
  ],
  "SummaryWords": [
    "Cool",
    "Windy",
    "Humid"
  ]
}

Gösterilen JSON dosyasını gösterilen türe seri durumdan çıkartırsanız ve DatesAvailableSummaryWords özelliklerinin gideceği hiçbir yer yoktur ve kaybolur. Bu özellikler gibi ek verileri yakalamak için , veya türündeki Dictionary<string,object>Dictionary<string,JsonElement>bir özelliğe [JsonExtensionData] özniteliğini uygulayın:

public class WeatherForecastWithExtensionData
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string? Summary { get; set; }
    [JsonExtensionData]
    public Dictionary<string, JsonElement>? ExtensionData { get; set; }
}
Public Class WeatherForecastWithExtensionData
    Public Property [Date] As DateTimeOffset
    Public Property TemperatureCelsius As Integer
    Public Property Summary As String

    <JsonExtensionData>
    Public Property ExtensionData As Dictionary(Of String, Object)

End Class

Aşağıdaki tabloda, daha önce gösterilen JSON'un seri durumdan çıkararak bu örnek türüne dönüştürülmesi sonucu gösterilmektedir. Ek veriler özelliğin anahtar-değer çiftlerine ExtensionData dönüşür:

Özellik Değer Notlar
Date "8/1/2019 12:00:00 AM -07:00"
TemperatureCelsius 0 Büyük/küçük harfe duyarlı uyuşmazlık (temperatureCelsius JSON'da) özelliği ayarlanmadığından.
Summary "Hot"
ExtensionData "temperatureCelsius": 25,
"DatesAvailable": ["2019-08-01T00:00:00-07:00","2019-08-02T00:00:00-07:00"],
"SummaryWords": ["Cool","Windy","Humid"]
Büyük/küçük harf eşleşmediğinden, temperatureCelsius ek bir değerdir ve sözlükte anahtar-değer çifti olur.
JSON'dan gelen her ek dizi bir anahtar-değer çifti olur ve değer nesnesi olarak bir dizi olur.

Hedef nesne seri hale getirildiğinde, uzantı veri anahtarı değer çiftleri aynı gelen JSON'daki gibi JSON özelliklerine dönüşür:

{
  "Date": "2019-08-01T00:00:00-07:00",
  "TemperatureCelsius": 0,
  "Summary": "Hot",
  "temperatureCelsius": 25,
  "DatesAvailable": [
    "2019-08-01T00:00:00-07:00",
    "2019-08-02T00:00:00-07:00"
  ],
  "SummaryWords": [
    "Cool",
    "Windy",
    "Humid"
  ]
}

ExtensionData Özellik adının JSON'da görünmediğini fark edin. Bu davranış, JSON'un seri durumdan çıkarılmayacağı ek verileri kaybetmeden gidiş dönüş yapmasını sağlar.

Aşağıdaki örnekte JSON'dan seri durumdan çıkarılmış bir nesneye gidiş dönüş ve JSON'a dönüş gösterilmektedir:

using System.Text.Json;
using System.Text.Json.Serialization;

namespace RoundtripExtensionData
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
        [JsonExtensionData]
        public Dictionary<string, JsonElement>? ExtensionData { get; set; }
    }

    public class Program
    {
        public static void Main()
        {
            string jsonString =
@"{
  ""Date"": ""2019-08-01T00:00:00-07:00"",
  ""temperatureCelsius"": 25,
  ""Summary"": ""Hot"",
  ""SummaryField"": ""Hot"",
  ""DatesAvailable"": [
    ""2019-08-01T00:00:00-07:00"",
    ""2019-08-02T00:00:00-07:00""
  ],
  ""SummaryWords"": [
    ""Cool"",
    ""Windy"",
    ""Humid""
  ]
}";
            WeatherForecast weatherForecast = 
                JsonSerializer.Deserialize<WeatherForecast>(jsonString)!;

            var serializeOptions = new JsonSerializerOptions { WriteIndented = true };
            jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
            Console.WriteLine($"JSON output:\n{jsonString}\n");
        }
    }
}
// output:
//JSON output:
//{
//  "Date": "2019-08-01T00:00:00-07:00",
//  "TemperatureCelsius": 0,
//  "Summary": "Hot",
//  "temperatureCelsius": 25,
//  "SummaryField": "Hot",
//  "DatesAvailable": [
//    "2019-08-01T00:00:00-07:00",
//    "2019-08-02T00:00:00-07:00"
//  ],
//  "SummaryWords": [
//    "Cool",
//    "Windy",
//    "Humid"
//  ]
//}

Seri durumdan çıkararak JsonElement veya JsonNode'a dönüştürme

Yalnızca belirli bir özellik için hangi JSON'un kabul edilebilir olduğu konusunda esnek olmak istiyorsanız, alternatif olarak veya JsonNodeseri durumdan çıkarmaktırJsonElement. Geçerli JSON özellikleri veya JsonNodeolarak JsonElement seri durumdan çıkarılabilir. Sabit bir nesne oluşturmayı veya JsonNode değiştirilebilir bir nesne oluşturmayı seçinJsonElement.

Aşağıdaki örnekte, ve JsonNodetürü JsonElement özelliklerini içeren bir sınıf için JSON'dan JSON'a gidiş dönüş gösterilmektedir.

using System.Text.Json;
using System.Text.Json.Nodes;

namespace RoundtripJsonElementAndNode
{
    public class WeatherForecast
    {
        public DateTimeOffset Date { get; set; }
        public int TemperatureCelsius { get; set; }
        public string? Summary { get; set; }
        public JsonElement DatesAvailable { get; set; }
        public JsonNode? SummaryWords { get; set; }
    }
        public class Program
    {
        public static void Main()
        {
            string jsonString =
@"{
  ""Date"": ""2019-08-01T00:00:00-07:00"",
  ""TemperatureCelsius"": 25,
  ""Summary"": ""Hot"",
  ""DatesAvailable"": [
    ""2019-08-01T00:00:00-07:00"",
    ""2019-08-02T00:00:00-07:00""
  ],
  ""SummaryWords"": [
    ""Cool"",
    ""Windy"",
    ""Humid""
  ]
}";
            WeatherForecast? weatherForecast = 
                JsonSerializer.Deserialize<WeatherForecast>(jsonString);

            var serializeOptions = new JsonSerializerOptions { WriteIndented = true };
            jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
            Console.WriteLine(jsonString);
        }
    }
}
// output:
//{
//  "Date": "2019-08-01T00:00:00-07:00",
//  "TemperatureCelsius": 25,
//  "Summary": "Hot",
//  "DatesAvailable": [
//    "2019-08-01T00:00:00-07:00",
//    "2019-08-02T00:00:00-07:00"
//  ],
//  "SummaryWords": [
//    "Cool",
//    "Windy",
//    "Humid"
//  ]
//}

Ayrıca bkz.