Share via


Overloop-JSON afhandelen of JsonElement of JsonNode gebruiken in System.Text.Json

In dit artikel wordt beschreven hoe u overloop-JSON kunt verwerken met de System.Text.Json naamruimte. Het laat ook zien hoe u deserialiseren in JsonElement of JsonNode, als alternatief voor andere scenario's waarbij het doeltype mogelijk niet perfect overeenkomt met alle JSON die wordt gedeserialiseerd.

Overloop-JSON verwerken

Tijdens het deserialiseren ontvangt u mogelijk gegevens in de JSON die niet wordt vertegenwoordigd door eigenschappen van het doeltype. Stel dat uw doeltype dit is:

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

En de JSON die moet worden gedeserialiseerd, is dit:

{
  "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"
  ]
}

Als u deserialiseert van de JSON die wordt weergegeven in het weergegeven type, gaan de DatesAvailable eigenschappen en SummaryWords eigenschappen nergens heen en gaan ze verloren. Als u extra gegevens zoals deze eigenschappen wilt vastleggen, past u het kenmerk [JsonExtensionData] toe op een eigenschap van het type Dictionary<string,object> of Dictionary<string,JsonElement>:

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

In de volgende tabel ziet u het resultaat van het deserialiseren van de JSON die eerder in dit voorbeeldtype is weergegeven. De extra gegevens worden sleutel-waardeparen van de ExtensionData eigenschap:

Eigenschappen Weergegeven als Opmerkingen
Date "8/1/2019 12:00:00 AM -07:00"
TemperatureCelsius 0 Hoofdlettergevoelige verschillen (temperatureCelsius in de JSON), zodat de eigenschap niet is ingesteld.
Summary "Hot"
ExtensionData "temperatureCelsius": 25,
"DatesAvailable": ["2019-08-01T00:00:00-07:00","2019-08-02T00:00:00-07:00"],
"SummaryWords": ["Cool","Windy","Humid"]
Omdat de case niet overeenkomt, temperatureCelsius is dit een extra en wordt het een sleutel-waardepaar in de woordenlijst.
Elke extra matrix van de JSON wordt een sleutel-waardepaar, met een matrix als waardeobject.

Wanneer het doelobject wordt geserialiseerd, worden de sleutel-waardeparen voor extensiegegevens JSON-eigenschappen, net zoals in de binnenkomende JSON:

{
  "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"
  ]
}

U ziet dat de naam van de ExtensionData eigenschap niet wordt weergegeven in de JSON. Met dit gedrag kan de JSON een retour maken zonder extra gegevens te verliezen die anders niet gedeserialiseerd zouden worden.

In het volgende voorbeeld ziet u een retour van JSON naar een gedeserialiseerd object en terug naar JSON:

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"
//  ]
//}

Deserialiseren in JsonElement of JsonNode

Als u alleen flexibel wilt zijn over wat JSON acceptabel is voor een bepaalde eigenschap, is een alternatief om te deserialiseren in JsonElement of JsonNode. Elke geldige JSON-eigenschap kan worden gedeserialiseerd in JsonElement of JsonNode. Kies ervoor JsonElement om een onveranderbaar object te maken of JsonNode om een veranderlijk object te maken.

In het volgende voorbeeld ziet u een retour van JSON en terug naar JSON voor een klasse met eigenschappen van het type JsonElement en JsonNode.

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"
//  ]
//}

Zie ook