'da JSON belge nesne modeli kullanma System.Text.Json
Bu makalede, JSON yükündeki verilere rastgele erişim için JSON belge nesne modelinin (DOM) nasıl kullanılacağı gösterilmektedir.
JSON DOM seçenekleri
DOM ile çalışmak, şu durumlarda seri durumdan çıkarmanın JsonSerializer bir alternatifidir:
- Seri durumdan çıkarabileceğiniz bir türünüz yok.
- Aldığınız JSON'un sabit bir şeması yok ve ne içerdiğini öğrenmek için incelenmesi gerekiyor.
System.Text.Json
JSON DOM oluşturmak için iki yol sağlar:
JsonDocument kullanarak
Utf8JsonReader
salt okunur bir DOM oluşturma olanağı sağlar. Yükü oluşturan JSON öğelerine türü aracılığıyla JsonElement erişilebilir. türü,JsonElement
JSON metnini yaygın .NET türlerine dönüştürmek için API'lerle birlikte dizi ve nesne numaralandırıcıları sağlar.JsonDocument
bir RootElement özelliği kullanıma sunar. Daha fazla bilgi için bu makalenin devamında yer alan JsonDocument'ı kullanma konusuna bakın.JsonNode ve ad alanında System.Text.Json.Nodes ondan türetilen sınıflar, değiştirilebilir bir DOM oluşturma olanağı sağlar. Yükü oluşturan JSON öğelerine , , JsonObject, JsonArrayJsonValueve JsonElement türleri aracılığıyla JsonNodeerişilebilir. Daha fazla bilgi için bu makalenin devamında kullanma
JsonNode
bölümüne bakın.
ve JsonNode
arasında JsonDocument
seçim yaparken aşağıdaki faktörleri göz önünde bulundurun:
JsonNode
DOM oluşturulduktan sonra değiştirilebilir.JsonDocument
DOM sabittir.JsonDocument
DOM, verilerine daha hızlı erişim sağlar.
JsonNode
komutunu kullanma
Aşağıdaki örnekte, ad alanının nasıl kullanılacağı ve ad alanında yer alan diğer türlerin System.Text.Json.Nodes nasıl kullanılacağı JsonNode gösterilmektedir:
- JSON dizesinden DOM oluşturma
- DOM'dan JSON yazın.
- DOM'dan değer, nesne veya dizi alma.
using System.Text.Json;
using System.Text.Json.Nodes;
namespace JsonNodeFromStringExample;
public class Program
{
public static void Main()
{
string jsonString = """
{
"Date": "2019-08-01T00:00:00",
"Temperature": 25,
"Summary": "Hot",
"DatesAvailable": [
"2019-08-01T00:00:00",
"2019-08-02T00:00:00"
],
"TemperatureRanges": {
"Cold": {
"High": 20,
"Low": -10
},
"Hot": {
"High": 60,
"Low": 20
}
}
}
""";
// Create a JsonNode DOM from a JSON string.
JsonNode forecastNode = JsonNode.Parse(jsonString)!;
// Write JSON from a JsonNode
var options = new JsonSerializerOptions { WriteIndented = true };
Console.WriteLine(forecastNode!.ToJsonString(options));
// output:
//{
// "Date": "2019-08-01T00:00:00",
// "Temperature": 25,
// "Summary": "Hot",
// "DatesAvailable": [
// "2019-08-01T00:00:00",
// "2019-08-02T00:00:00"
// ],
// "TemperatureRanges": {
// "Cold": {
// "High": 20,
// "Low": -10
// },
// "Hot": {
// "High": 60,
// "Low": 20
// }
// }
//}
// Get value from a JsonNode.
JsonNode temperatureNode = forecastNode!["Temperature"]!;
Console.WriteLine($"Type={temperatureNode.GetType()}");
Console.WriteLine($"JSON={temperatureNode.ToJsonString()}");
//output:
//Type = System.Text.Json.Nodes.JsonValue`1[System.Text.Json.JsonElement]
//JSON = 25
// Get a typed value from a JsonNode.
int temperatureInt = (int)forecastNode!["Temperature"]!;
Console.WriteLine($"Value={temperatureInt}");
//output:
//Value=25
// Get a typed value from a JsonNode by using GetValue<T>.
temperatureInt = forecastNode!["Temperature"]!.GetValue<int>();
Console.WriteLine($"TemperatureInt={temperatureInt}");
//output:
//Value=25
// Get a JSON object from a JsonNode.
JsonNode temperatureRanges = forecastNode!["TemperatureRanges"]!;
Console.WriteLine($"Type={temperatureRanges.GetType()}");
Console.WriteLine($"JSON={temperatureRanges.ToJsonString()}");
//output:
//Type = System.Text.Json.Nodes.JsonObject
//JSON = { "Cold":{ "High":20,"Low":-10},"Hot":{ "High":60,"Low":20} }
// Get a JSON array from a JsonNode.
JsonNode datesAvailable = forecastNode!["DatesAvailable"]!;
Console.WriteLine($"Type={datesAvailable.GetType()}");
Console.WriteLine($"JSON={datesAvailable.ToJsonString()}");
//output:
//datesAvailable Type = System.Text.Json.Nodes.JsonArray
//datesAvailable JSON =["2019-08-01T00:00:00", "2019-08-02T00:00:00"]
// Get an array element value from a JsonArray.
JsonNode firstDateAvailable = datesAvailable[0]!;
Console.WriteLine($"Type={firstDateAvailable.GetType()}");
Console.WriteLine($"JSON={firstDateAvailable.ToJsonString()}");
//output:
//Type = System.Text.Json.Nodes.JsonValue`1[System.Text.Json.JsonElement]
//JSON = "2019-08-01T00:00:00"
// Get a typed value by chaining references.
int coldHighTemperature = (int)forecastNode["TemperatureRanges"]!["Cold"]!["High"]!;
Console.WriteLine($"TemperatureRanges.Cold.High={coldHighTemperature}");
//output:
//TemperatureRanges.Cold.High = 20
// Parse a JSON array
var datesNode = JsonNode.Parse(@"[""2019-08-01T00:00:00"",""2019-08-02T00:00:00""]");
JsonNode firstDate = datesNode![0]!.GetValue<DateTime>();
Console.WriteLine($"firstDate={ firstDate}");
//output:
//firstDate = "2019-08-01T00:00:00"
}
}
Nesne başlatıcılarla JsonNode DOM oluşturma ve değişiklik yapma
Aşağıdaki örnekte şunların nasıl yapılacağını gösterilmektedir:
- Nesne başlatıcıları kullanarak bir DOM oluşturun.
- DOM'da değişiklik yapma.
using System.Text.Json;
using System.Text.Json.Nodes;
namespace JsonNodeFromObjectExample;
public class Program
{
public static void Main()
{
// Create a new JsonObject using object initializers.
var forecastObject = new JsonObject
{
["Date"] = new DateTime(2019, 8, 1),
["Temperature"] = 25,
["Summary"] = "Hot",
["DatesAvailable"] = new JsonArray(
new DateTime(2019, 8, 1), new DateTime(2019, 8, 2)),
["TemperatureRanges"] = new JsonObject
{
["Cold"] = new JsonObject
{
["High"] = 20,
["Low"] = -10
}
},
["SummaryWords"] = new JsonArray("Cool", "Windy", "Humid")
};
// Add an object.
forecastObject!["TemperatureRanges"]!["Hot"] =
new JsonObject { ["High"] = 60, ["Low"] = 20 };
// Remove a property.
forecastObject.Remove("SummaryWords");
// Change the value of a property.
forecastObject["Date"] = new DateTime(2019, 8, 3);
var options = new JsonSerializerOptions { WriteIndented = true };
Console.WriteLine(forecastObject.ToJsonString(options));
//output:
//{
// "Date": "2019-08-03T00:00:00",
// "Temperature": 25,
// "Summary": "Hot",
// "DatesAvailable": [
// "2019-08-01T00:00:00",
// "2019-08-02T00:00:00"
// ],
// "TemperatureRanges": {
// "Cold": {
// "High": 20,
// "Low": -10
// },
// "Hot": {
// "High": 60,
// "Low": 20
// }
// }
//}
}
}
JSON yükünün alt dizilerini seri durumdan çıkarma
Aşağıdaki örnek, JSON ağacının bir alt bölümüne gitmek ve bu alt bölümden tek bir değeri, özel türü veya diziyi seri durumdan çıkarmak için JsonNode'un nasıl kullanılacağını gösterir.
using System.Text.Json;
using System.Text.Json.Nodes;
namespace JsonNodePOCOExample;
public class TemperatureRanges : Dictionary<string, HighLowTemps>
{
}
public class HighLowTemps
{
public int High { get; set; }
public int Low { get; set; }
}
public class Program
{
public static DateTime[]? DatesAvailable { get; set; }
public static void Main()
{
string jsonString = """
{
"Date": "2019-08-01T00:00:00",
"Temperature": 25,
"Summary": "Hot",
"DatesAvailable": [
"2019-08-01T00:00:00",
"2019-08-02T00:00:00"
],
"TemperatureRanges": {
"Cold": {
"High": 20,
"Low": -10
},
"Hot": {
"High": 60,
"Low": 20
}
}
}
""";
// Parse all of the JSON.
JsonNode forecastNode = JsonNode.Parse(jsonString)!;
// Get a single value
int hotHigh = forecastNode["TemperatureRanges"]!["Hot"]!["High"]!.GetValue<int>();
Console.WriteLine($"Hot.High={hotHigh}");
// output:
//Hot.High=60
// Get a subsection and deserialize it into a custom type.
JsonObject temperatureRangesObject = forecastNode!["TemperatureRanges"]!.AsObject();
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream);
temperatureRangesObject.WriteTo(writer);
writer.Flush();
TemperatureRanges? temperatureRanges =
JsonSerializer.Deserialize<TemperatureRanges>(stream.ToArray());
Console.WriteLine($"Cold.Low={temperatureRanges!["Cold"].Low}, Hot.High={temperatureRanges["Hot"].High}");
// output:
//Cold.Low=-10, Hot.High=60
// Get a subsection and deserialize it into an array.
JsonArray datesAvailable = forecastNode!["DatesAvailable"]!.AsArray()!;
Console.WriteLine($"DatesAvailable[0]={datesAvailable[0]}");
// output:
//DatesAvailable[0]=8/1/2019 12:00:00 AM
}
}
JsonNode ortalama not örneği
Aşağıdaki örnek, tamsayı değerlerine sahip bir JSON dizisi seçer ve ortalama değeri hesaplar:
using System.Text.Json.Nodes;
namespace JsonNodeAverageGradeExample;
public class Program
{
public static void Main()
{
string jsonString = """
{
"Class Name": "Science",
"Teacher\u0027s Name": "Jane",
"Semester": "2019-01-01",
"Students": [
{
"Name": "John",
"Grade": 94.3
},
{
"Name": "James",
"Grade": 81.0
},
{
"Name": "Julia",
"Grade": 91.9
},
{
"Name": "Jessica",
"Grade": 72.4
},
{
"Name": "Johnathan"
}
],
"Final": true
}
""";
double sum = 0;
JsonNode document = JsonNode.Parse(jsonString)!;
JsonNode root = document.Root;
JsonArray studentsArray = root["Students"]!.AsArray();
int count = studentsArray.Count;
foreach (JsonNode? student in studentsArray)
{
if (student?["Grade"] is JsonNode gradeNode)
{
sum += (double)gradeNode;
}
else
{
sum += 70;
}
}
double average = sum / count;
Console.WriteLine($"Average grade : {average}");
}
}
// output:
//Average grade : 81.92
Yukarıdaki kod:
- Özelliği olan bir
Students
dizideki nesneler için ortalama birGrade
not hesaplar. - Notu olmayan öğrenciler için varsayılan olarak 70 notu atar.
- özelliğinden
Count
JsonArray
öğrenci sayısını alır.
JsonNode
ile JsonSerializerOptions
örneğini JsonNode
serileştirmek ve seri durumdan çıkarmak için kullanabilirsinizJsonSerializer
. Ancak, kullanan bir aşırı yükleme JsonSerializerOptions
kullanırsanız, seçenekler örneği yalnızca özel dönüştürücüler almak için kullanılır. Seçenekler örneğinin diğer özellikleri kullanılmaz. Örneğin, değerini ayarlarsanız JsonSerializerOptions.DefaultIgnoreCondition WhenWritingNull ve kullanan JsonSerializerOptions
bir aşırı yüklemeyle çağırırsanız JsonSerializer
null özellikler yoksayılamaz.
Aynı sınırlama, bir JsonSerializerOptions
parametre alan yöntemler için JsonNode
de geçerlidir: WriteTo(Utf8JsonWriter, JsonSerializerOptions) ve ToJsonString(JsonSerializerOptions). Bu API'ler yalnızca özel dönüştürücüler almak için kullanır JsonSerializerOptions
.
Aşağıdaki örnek, parametre alan ve örneği JsonSerializerOptions
seri hale JsonNode
getiren yöntemlerin kullanılmasının sonucunu gösterir:
using System.Text;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
namespace JsonNodeWithJsonSerializerOptions;
public class Program
{
public static void Main()
{
Person person = new() { Name = "Nancy" };
// Default serialization - Address property included with null token.
// Output: {"Name":"Nancy","Address":null}
string personJsonWithNull = JsonSerializer.Serialize(person);
Console.WriteLine(personJsonWithNull);
// Serialize and ignore null properties - null Address property is omitted
// Output: {"Name":"Nancy"}
JsonSerializerOptions options = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
string personJsonWithoutNull = JsonSerializer.Serialize(person, options);
Console.WriteLine(personJsonWithoutNull);
// Ignore null properties doesn't work when serializing JsonNode instance
// by using JsonSerializer.
// Output: {"Name":"Nancy","Address":null}
JsonNode? personJsonNode = JsonSerializer.Deserialize<JsonNode>(personJsonWithNull);
personJsonWithNull = JsonSerializer.Serialize(personJsonNode, options);
Console.WriteLine(personJsonWithNull);
// Ignore null properties doesn't work when serializing JsonNode instance
// by using JsonNode.ToJsonString method.
// Output: {"Name":"Nancy","Address":null}
personJsonWithNull = personJsonNode!.ToJsonString(options);
Console.WriteLine(personJsonWithNull);
// Ignore null properties doesn't work when serializing JsonNode instance
// by using JsonNode.WriteTo method.
// Output: {"Name":"Nancy","Address":null}
using var stream = new MemoryStream();
using var writer = new Utf8JsonWriter(stream);
personJsonNode!.WriteTo(writer, options);
writer.Flush();
personJsonWithNull = Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine(personJsonWithNull);
}
}
public class Person
{
public string? Name { get; set; }
public string? Address { get; set; }
}
Özel dönüştürücüler dışındaki özelliklere JsonSerializerOptions
ihtiyacınız varsa, yerine kesin olarak belirlenmiş hedeflerle (bu örnekteki Person
sınıf gibi) JsonNode
kullanınJsonSerializer
.
Özellik sırasını işleme
JsonObject , yükündeki JsonNodeöğelerden biridir ve değiştirilebilir bir JSON nesnesini temsil eder. Türü, her girişin nesnesinin bir özelliği olduğu bir IDictionary<string, JsonNode>
olarak modellenmiş olsa da, örtük bir özellik sırasını kapsüller. Ancak ve gibi Insert(Int32, String, JsonNode) RemoveAt(Int32) API'ler, belirli bir dizine öğe eklemenize ve kaldırmanıza izin vererek türü sıralı sözlük olarak etkili bir şekilde modeller. Bu API'ler, özellik sırasını doğrudan etkileyebilecek nesne örneklerinde değişikliklere izin verir.
Aşağıdaki kod, belirli bir özelliği ekleme veya nesnenin başlangıcına taşıma örneğini gösterir.
var schema = (JsonObject)JsonSerializerOptions.Default.GetJsonSchemaAsNode(typeof(MyPoco));
JsonNode? idValue;
switch (schema.IndexOf("$id"))
{
// $id property missing.
case < 0:
idValue = (JsonNode)"https://example.com/schema";
schema.Insert(0, "$id", idValue);
break;
// $id property already at the start of the object.
case 0:
break;
// $id exists but not at the start of the object.
case int index:
idValue = schema[index];
schema.RemoveAt(index);
schema.Insert(0, "$id", idValue);
break;
}
JsonNodes karşılaştırması
İki nesneyi eşitlik için karşılaştırmak JsonNode
için alt öğeleri de dahil olmak üzere yöntemini kullanın JsonNode.DeepEquals(JsonNode, JsonNode) .
JsonDocument
komutunu kullanma
Aşağıdaki örnekte, JSON dizesindeki JsonDocument verilere rastgele erişim için sınıfının nasıl kullanılacağı gösterilmektedir:
double sum = 0;
int count = 0;
using (JsonDocument document = JsonDocument.Parse(jsonString))
{
JsonElement root = document.RootElement;
JsonElement studentsElement = root.GetProperty("Students");
foreach (JsonElement student in studentsElement.EnumerateArray())
{
if (student.TryGetProperty("Grade", out JsonElement gradeElement))
{
sum += gradeElement.GetDouble();
}
else
{
sum += 70;
}
count++;
}
}
double average = sum / count;
Console.WriteLine($"Average grade : {average}");
Dim sum As Double = 0
Dim count As Integer = 0
Using document As JsonDocument = JsonDocument.Parse(jsonString)
Dim root As JsonElement = document.RootElement
Dim studentsElement As JsonElement = root.GetProperty("Students")
For Each student As JsonElement In studentsElement.EnumerateArray()
Dim gradeElement As JsonElement = Nothing
If student.TryGetProperty("Grade", gradeElement) Then
sum += gradeElement.GetDouble()
Else
sum += 70
End If
count += 1
Next
End Using
Dim average As Double = sum / count
Console.WriteLine($"Average grade : {average}")
Yukarıdaki kod:
- Çözümlenecek JSON'un adlı
jsonString
bir dizede olduğunu varsayar. - Özelliği olan bir
Students
dizideki nesneler için ortalama birGrade
not hesaplar. - Notu olmayan öğrenciler için varsayılan olarak 70 notu atar.
- bir deyiminde
JsonDocument
using
örneği oluşturur çünküJsonDocument
uygular.IDisposable
BirJsonDocument
örnek atıldıktan sonra tümJsonElement
örneklerine erişimi de kaybedersiniz. BirJsonElement
örneğe erişimi korumak için, üstJsonDocument
örnek atılmadan önce bir kopyasını oluşturun. Bir kopya oluşturmak için çağrısı yapın JsonElement.Clone. Daha fazla bilgi için bkz . JsonDocument IDisposable.
Yukarıdaki örnek kod, her yinelemede bir count
değişkeni artırarak öğrencileri sayar. Alternatif olarak, aşağıdaki örnekte gösterildiği gibi çağrısı GetArrayLengthyapabilirsiniz:
double sum = 0;
int count = 0;
using (JsonDocument document = JsonDocument.Parse(jsonString))
{
JsonElement root = document.RootElement;
JsonElement studentsElement = root.GetProperty("Students");
count = studentsElement.GetArrayLength();
foreach (JsonElement student in studentsElement.EnumerateArray())
{
if (student.TryGetProperty("Grade", out JsonElement gradeElement))
{
sum += gradeElement.GetDouble();
}
else
{
sum += 70;
}
}
}
double average = sum / count;
Console.WriteLine($"Average grade : {average}");
Dim sum As Double = 0
Dim count As Integer = 0
Using document As JsonDocument = JsonDocument.Parse(jsonString)
Dim root As JsonElement = document.RootElement
Dim studentsElement As JsonElement = root.GetProperty("Students")
count = studentsElement.GetArrayLength()
For Each student As JsonElement In studentsElement.EnumerateArray()
Dim gradeElement As JsonElement = Nothing
If student.TryGetProperty("Grade", gradeElement) Then
sum += gradeElement.GetDouble()
Else
sum += 70
End If
Next
End Using
Dim average As Double = sum / count
Console.WriteLine($"Average grade : {average}")
Bu kodun işlediği JSON örneği aşağıda verilmiştir:
{
"Class Name": "Science",
"Teacher\u0027s Name": "Jane",
"Semester": "2019-01-01",
"Students": [
{
"Name": "John",
"Grade": 94.3
},
{
"Name": "James",
"Grade": 81.0
},
{
"Name": "Julia",
"Grade": 91.9
},
{
"Name": "Jessica",
"Grade": 72.4
},
{
"Name": "Johnathan"
}
],
"Final": true
}
yerine kullanan JsonNode
benzer bir örnek için bkz. JsonNode ortalama notu örneği.JsonDocument
Bir JsonDocument ve JsonElement'de alt öğeler için arama
üzerindeki JsonElement
aramalar, özelliklerin sıralı bir aramasını gerektirir ve bu nedenle nispeten yavaştır (örneğin kullanırken TryGetProperty
). System.Text.Json arama zamanı yerine ilk ayrıştırma süresini en aza indirmek için tasarlanmıştır. Bu nedenle, bir JsonDocument
nesnede arama yaparken performansı iyileştirmek için aşağıdaki yaklaşımları kullanın:
- Kendi dizin oluşturma veya döngülerinizi yapmak yerine yerleşik numaralandırıcıları (EnumerateArray ve EnumerateObject) kullanın.
- kullanarak
RootElement
her özelliğin tamamıJsonDocument
üzerinde sıralı arama yapmayın. Bunun yerine, JSON verilerinin bilinen yapısına göre iç içe JSON nesneleri üzerinde arama yapın. Örneğin, yukarıdaki kod örnekleri, nesneler arasındaStudent
döngü yaparak ve özellikleri arayan tümJsonElement
nesnelerde arama yerine her biri için değeriniGrade
alarak nesnelerdeki birGrade
özelliğiStudent
ararGrade
. İkincinin yapılması, aynı verilerin üzerinden gereksiz geçişler yapılmasına neden olur.
JsonElements karşılaştırması
İki nesneyi eşitlik için karşılaştırmak JsonElement
için alt öğeleri de dahil olmak üzere yöntemini kullanın JsonElement.DeepEquals(JsonElement, JsonElement) .
JsonElement left = JsonDocument.Parse("10e-3").RootElement;
JsonElement right = JsonDocument.Parse("0.01").RootElement;
bool equal = JsonElement.DeepEquals(left, right);
Console.WriteLine(equal); // True.
JSON yazmak için kullanın JsonDocument
Aşağıdaki örnekte bir öğesinden JSON yazma işlemi gösterilmektedir JsonDocument:
string jsonString = File.ReadAllText(inputFileName);
var writerOptions = new JsonWriterOptions
{
Indented = true
};
var documentOptions = new JsonDocumentOptions
{
CommentHandling = JsonCommentHandling.Skip
};
using FileStream fs = File.Create(outputFileName);
using var writer = new Utf8JsonWriter(fs, options: writerOptions);
using JsonDocument document = JsonDocument.Parse(jsonString, documentOptions);
JsonElement root = document.RootElement;
if (root.ValueKind == JsonValueKind.Object)
{
writer.WriteStartObject();
}
else
{
return;
}
foreach (JsonProperty property in root.EnumerateObject())
{
property.WriteTo(writer);
}
writer.WriteEndObject();
writer.Flush();
Dim jsonString As String = File.ReadAllText(inputFileName)
Dim writerOptions As JsonWriterOptions = New JsonWriterOptions With {
.Indented = True
}
Dim documentOptions As JsonDocumentOptions = New JsonDocumentOptions With {
.CommentHandling = JsonCommentHandling.Skip
}
Dim fs As FileStream = File.Create(outputFileName)
Dim writer As Utf8JsonWriter = New Utf8JsonWriter(fs, options:=writerOptions)
Dim document As JsonDocument = JsonDocument.Parse(jsonString, documentOptions)
Dim root As JsonElement = document.RootElement
If root.ValueKind = JsonValueKind.[Object] Then
writer.WriteStartObject()
Else
Return
End If
For Each [property] As JsonProperty In root.EnumerateObject()
[property].WriteTo(writer)
Next
writer.WriteEndObject()
writer.Flush()
Yukarıdaki kod:
- JSON dosyasını okur, verileri içine
JsonDocument
yükler ve biçimlendirilmiş (oldukça yazdırılmış) JSON dosyasını bir dosyaya yazar. - Giriş JSON'sindeki açıklamalara izin verileceğini ancak yoksayılacağını belirtmek için kullanılır JsonDocumentOptions .
- İşiniz bittiğinde, yazıcıyı arar Flush . Alternatif olarak, yazıcının atıldığında otomatik olarak boşaltılması sağlanır.
Örnek kod tarafından işlenecek bir JSON girişi örneği aşağıda verilmişti:
{"Class Name": "Science","Teacher's Name": "Jane","Semester": "2019-01-01","Students": [{"Name": "John","Grade": 94.3},{"Name": "James","Grade": 81.0},{"Name": "Julia","Grade": 91.9},{"Name": "Jessica","Grade": 72.4},{"Name": "Johnathan"}],"Final": true}
Sonuç şu oldukça yazdırılmış JSON çıkışıdır:
{
"Class Name": "Science",
"Teacher\u0027s Name": "Jane",
"Semester": "2019-01-01",
"Students": [
{
"Name": "John",
"Grade": 94.3
},
{
"Name": "James",
"Grade": 81.0
},
{
"Name": "Julia",
"Grade": 91.9
},
{
"Name": "Jessica",
"Grade": 72.4
},
{
"Name": "Johnathan"
}
],
"Final": true
}
JsonDocument is IDisposable
JsonDocument
havuza alınan arabelleğe verilerin bellek içi görünümünü oluşturur. Bu nedenle JsonDocument
türü uygular IDisposable
ve bir using
bloğun içinde kullanılması gerekir.
Yalnızca yaşam süresi sahipliğini aktarmak ve sorumluluğu arayana atmak istiyorsanız API'nizden bir JsonDocument
döndürebilirsiniz. Çoğu senaryoda bu gerekli değildir. Çağıranın tüm JSON belgesiyle çalışması gerekiyorsa, öğesinin Clone RootElementJsonElementdeğerini döndürür. Çağıranın JSON belgesinde belirli bir öğeyle çalışması gerekiyorsa, öğesinin JsonElementdeğerini Clone döndürür. veya alt öğesini doğrudan yapmadan döndürürsenizRootElement
, çağıran, sahibi atıldıktan sonra JsonDocument
döndürülen JsonElement
öğesine erişemez.Clone
Aşağıda, bir oluşturmanızı gerektiren bir örnek verilmiştir Clone
:
public JsonElement LookAndLoad(JsonElement source)
{
string json = File.ReadAllText(source.GetProperty("fileName").GetString());
using (JsonDocument doc = JsonDocument.Parse(json))
{
return doc.RootElement.Clone();
}
}
Yukarıdaki kod, bir özellik içeren bir JsonElement
fileName
bekler. JSON dosyasını açar ve bir JsonDocument
oluşturur. yöntemi, çağıranın belgenin tamamıyla çalışmak istediğini varsayar, bu nedenle öğesini döndürür Clone
RootElement
.
bir alırsanız JsonElement
ve bir alt öğe döndürecekseniz, alt öğenin bir Clone
değerini döndürmeniz gerekmez. Çağıran, geçirilenin JsonElement
ait olduğu canlı tutmakla JsonDocument
sorumludur. Örneğin:
public JsonElement ReturnFileName(JsonElement source)
{
return source.GetProperty("fileName");
}
JsonDocument
ile JsonSerializerOptions
örneğini JsonDocument
serileştirmek ve seri durumdan çıkarmak için kullanabilirsinizJsonSerializer
. Ancak, kullanarak JsonSerializer
örnekleri okuma ve yazma JsonDocument
uygulaması ve JsonDocument.WriteTo(Utf8JsonWriter)üzerinde JsonDocument.ParseValue(Utf8JsonReader) bir sarmalayıcıdır. Bu sarmalayıcı herhangi bir JsonSerializerOptions
(seri hale getirici özelliği) veya Utf8JsonWriter
adresine Utf8JsonReader
iletmez. Örneğin, değerini ayarlarsanız JsonSerializerOptions.DefaultIgnoreCondition WhenWritingNull ve kullanan JsonSerializerOptions
bir aşırı yüklemeyle çağırırsanız JsonSerializer
null özellikler yoksayılamaz.
Aşağıdaki örnek, parametre alan ve örneği JsonSerializerOptions
seri hale JsonDocument
getiren yöntemlerin kullanılmasının sonucunu gösterir:
using System.Text.Json;
using System.Text.Json.Serialization;
namespace JsonDocumentWithJsonSerializerOptions;
public class Program
{
public static void Main()
{
Person person = new() { Name = "Nancy" };
// Default serialization - Address property included with null token.
// Output: {"Name":"Nancy","Address":null}
string personJsonWithNull = JsonSerializer.Serialize(person);
Console.WriteLine(personJsonWithNull);
// Serialize and ignore null properties - null Address property is omitted
// Output: {"Name":"Nancy"}
JsonSerializerOptions options = new()
{
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
string personJsonWithoutNull = JsonSerializer.Serialize(person, options);
Console.WriteLine(personJsonWithoutNull);
// Ignore null properties doesn't work when serializing JsonDocument instance
// by using JsonSerializer.
// Output: {"Name":"Nancy","Address":null}
JsonDocument? personJsonDocument = JsonSerializer.Deserialize<JsonDocument>(personJsonWithNull);
personJsonWithNull = JsonSerializer.Serialize(personJsonDocument, options);
Console.WriteLine(personJsonWithNull);
}
}
public class Person
{
public string? Name { get; set; }
public string? Address { get; set; }
}
özelliklerine JsonSerializerOptions
ihtiyacınız varsa, yerine kesin olarak belirlenmiş hedeflerle (bu örnekteki Person
sınıf gibi) JsonDocument
kullanınJsonSerializer
.