Taşma JSON'ını işleme veya JsonElement veya JsonNode kullanma
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 DatesAvailable
SummaryWords
ö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 JsonNode
olarak 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 JsonNode
tü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"
// ]
//}