## About Provides high-performance and low-allocating types that serialize objects to JavaScript Object Notation (JSON) text and deserialize JSON text to objects, with UTF-8 support built-in. Also provides types to read and write JSON text encoded as UTF-8, and to create an in-memory document object model (DOM), that is read-only, for random access of the JSON elements within a structured view of the data. ## Key Features * High-performance reader and writer types for UTF-8 encoded JSON. * A fully-featured JSON serializer for .NET types using reflection or source generated contracts. * A high-performance read-only JSON DOM (JsonDocument) and a mutable DOM that interoperates with the serializer (JsonNode). * Built-in support for async serialization, including IAsyncEnumerable support. * Fully customizable contract model for serializable types. ## How to Use The System.Text.Json library is built-in as part of the shared framework in .NET Runtime. The package can be installed when you need to use the most recent version in older target frameworks. Serialization: ```csharp using System; using System.Text.Json; WeatherForecast forecast = new (DateTimeOffset.Now, 26.6f, "Sunny"); var serialized = JsonSerializer.Serialize(forecast); Console.WriteLine(serialized); // {"Date":"2023-08-02T16:01:20.9025406+00:00","TemperatureCelsius":26.6,"Summary":"Sunny"} var forecastDeserialized = JsonSerializer.Deserialize(serialized); Console.WriteLine(forecast == forecastDeserialized); // True public record WeatherForecast(DateTimeOffset Date, float TemperatureCelsius, string? Summary); ``` Serialization using the source generator: ```csharp using System.Text.Json; using System.Text.Json.Serialization; WeatherForecast forecast = new (DateTimeOffset.Now, 26.6f, "Sunny"); var serialized = JsonSerializer.Serialize(forecast, SourceGenerationContext.Default.WeatherForecast); Console.WriteLine(serialized); // {"Date":"2023-08-02T16:01:20.9025406+00:00","TemperatureCelsius":26.6,"Summary":"Sunny"} var forecastDeserialized = JsonSerializer.Deserialize(serialized, SourceGenerationContext.Default.WeatherForecast); Console.WriteLine(forecast == forecastDeserialized); // True public record WeatherForecast(DateTimeOffset Date, float TemperatureCelsius, string? Summary); [JsonSourceGenerationOptions(WriteIndented = true)] [JsonSerializable(typeof(WeatherForecast))] internal partial class SourceGenerationContext : JsonSerializerContext { } ``` Using the JSON DOM: ```csharp using System; using System.Text.Json; using System.Text.Json.Nodes; 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 } } } "; JsonNode forecastNode = JsonNode.Parse(jsonString)!; // 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. temperatureInt = forecastNode["Temperature"]!.GetValue(); 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 JsonNode datesNode = JsonNode.Parse(@"[""2019-08-01T00:00:00"",""2019-08-02T00:00:00""]")!; JsonNode firstDate = datesNode[0]!.GetValue(); Console.WriteLine($"firstDate={ firstDate}"); //output: //firstDate = "2019-08-01T00:00:00" ``` Using the low-level JSON reader/writer types ```csharp using System; using System.IO; using System.Text; using System.Text.Json; var writerOptions = new JsonWriterOptions { Indented = true }; using var stream = new MemoryStream(); using var writer = new Utf8JsonWriter(stream, writerOptions); writer.WriteStartObject(); writer.WriteString("date", DateTimeOffset.Parse("8/2/2023 9:00 AM")); writer.WriteNumber("temp", 42); writer.WriteEndObject(); writer.Flush(); var jsonBytes = stream.ToArray(); string json = Encoding.UTF8.GetString(jsonBytes); Console.WriteLine(json); // { // "date": "2023-08-02T09:00:00+00:00" // "temp": 42 // } var readerOptions = new JsonReaderOptions { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip }; var reader = new Utf8JsonReader(jsonBytes, readerOptions); while (reader.Read()) { Console.Write(reader.TokenType); switch (reader.TokenType) { case JsonTokenType.PropertyName: case JsonTokenType.String: { string? text = reader.GetString(); Console.Write(" "); Console.Write(text); break; } case JsonTokenType.Number: { int intValue = reader.GetInt32(); Console.Write(" "); Console.Write(intValue); break; } // Other token types elided for brevity } Console.WriteLine(); } // StartObject // PropertyName date // String 2023-08-02T09:00:00+00:00 // PropertyName temp // Number 42 // EndObject ``` ## Main Types The main types provided by this library are: * `System.Text.Json.Utf8JsonWriter` * `System.Text.Json.Utf8JsonReader` * `System.Text.Json.JsonSerializer` * `System.Text.Json.JsonConverter` * `System.Text.Json.JsonDocument` * `System.Text.Json.Nodes.JsonNode` * `System.Text.Json.Serialization.Metadata.JsonTypeInfo` ## Additional Documentation * [Conceptual documentation](https://learn.microsoft.com/dotnet/standard/serialization/system-text-json/overview) * [API documentation](https://learn.microsoft.com/dotnet/api/system.text.json) ## Related Packages * Lightweight data formats abstraction: [System.Memory.Data](https://www.nuget.org/packages/System.Memory.Data/) * Serialization of HttpContent: [System.Net.Http.Json](https://www.nuget.org/packages/System.Net.Http.Json/) ## Feedback & Contributing System.Text.Json is released as open source under the [MIT license](https://licenses.nuget.org/MIT). Bug reports and contributions are welcome at [the GitHub repository](https://github.com/dotnet/runtime).