'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 Utf8JsonReadersalt 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 JsonNodearası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 bir Grade 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 JsonNodeserileştirmek ve seri durumdan çıkarmak için kullanabilirsinizJsonSerializer. Ancak, kullanan bir aşırı yükleme JsonSerializerOptionskullanı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 JsonSerializerOptionsbir 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) JsonNodekullanı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ı jsonStringbir dizede olduğunu varsayar.
  • Özelliği olan bir Students dizideki nesneler için ortalama bir Grade 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 Bir JsonDocument örnek atıldıktan sonra tüm JsonElement örneklerine erişimi de kaybedersiniz. Bir JsonElement örneğe erişimi korumak için, üst JsonDocument ö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 RootElementher ö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ında Student döngü yaparak ve özellikleri arayan tüm JsonElement nesnelerde arama yerine her biri için değerini Grade alarak nesnelerdeki bir Grade özelliği Student 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 JsonDocumentyü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 JsonDocumentoluş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 JsonDocumentserileş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 Utf8JsonWriteradresine Utf8JsonReader iletmez. Örneğin, değerini ayarlarsanız JsonSerializerOptions.DefaultIgnoreCondition WhenWritingNull ve kullanan JsonSerializerOptionsbir 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 JsonSerializerOptionsihtiyacınız varsa, yerine kesin olarak belirlenmiş hedeflerle (bu örnekteki Person sınıf gibi) JsonDocumentkullanınJsonSerializer.

Ayrıca bkz.