Konvertieren von NewtonSoft-Code in System.Text.Json in .net Core 3. Was entspricht JObject.Parse und JsonProperty?

12

Ich konvertiere meine NewtonSoft-Implementierung in eine neue JSON-Bibliothek in .net Core 3.0. Ich habe den folgenden Code

public static bool IsValidJson(string json)
{
    try
    {                
        JObject.Parse(json);
        return true;
    }
    catch (Exception ex)
    {
        Logger.ErrorFormat("Invalid Json Received {0}", json);
        Logger.Fatal(ex.Message);
        return false;
    }
}

Ich kann kein Äquivalent für finden JObject.Parse(json);

Was auch das Attribut sein JsonPropertyÄquivalent

public class ResponseJson
{
    [JsonProperty(PropertyName = "status")]
    public bool Status { get; set; }
    [JsonProperty(PropertyName = "message")]
    public string Message { get; set; }
    [JsonProperty(PropertyName = "Log_id")]
    public string LogId { get; set; }
    [JsonProperty(PropertyName = "Log_status")]
    public string LogStatus { get; set; }

    public string FailureReason { get; set; }
}

Eine weitere Sache, nach der ich suchen werde Formating.None.

Kamran Shahid
quelle
Was ich verstanden habe ist für einfaches Level json, es ist wirklich einfach. Für die Dinge, bei denen wir verschachtelten JSON, einige Zeitformate, Standardwerte, direkte JSON-Erstellung im Wörterbuch usw. verwendet haben, müssen wir darauf achten und ordnungsgemäße Unit-Tests durchführen, um das Ergebnis vor und nach der Konvertierung zu vergleichen
Kamran Shahid

Antworten:

15

Sie stellen hier einige Fragen:

  1. Ich kann kein Äquivalent für finden JObject.Parse(json);

    Sie können verwendet werden, JsonDocumentum zu analysieren jede JSON und zu untersuchen, mit seinem Start RootElement. Das JsonElementStammelement ist vom Typ, der einen beliebigen JSON-Wert (primitiv oder nicht) darstellt und dem von Newtonsoft entspricht JToken.

    Aber nehmen Sie zur Kenntnis dieser Dokumentation Bemerkung :

    Diese Klasse verwendet Ressourcen aus dem Poolspeicher, um die Auswirkungen des Garbage Collector (GC) in Szenarien mit hoher Auslastung zu minimieren. Wenn dieses Objekt nicht ordnungsgemäß entsorgt wird, wird der Speicher nicht an den Pool zurückgegeben, was die GC-Auswirkung auf verschiedene Teile des Frameworks erhöht.

    Wenn Sie ein JsonElementDokument außerhalb der Lebensdauer des Dokuments verwenden müssen, müssen Sie es klonen :

    Ruft eine JsonElement, die über die Lebensdauer des Originals hinaus sicher aufbewahrt werden kann JsonDocument.

    Beachten Sie auch, dass dies JsonDocumentderzeit schreibgeschützt ist und keine API zum Erstellen oder Ändern von JSON bereitstellt. Es gibt ein offenes Problem, Problem Nr. 39922: Beschreibbares Json-DOM , das dies verfolgt.

    Ein Anwendungsbeispiel lautet wie folgt:

    //https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations 
    using var doc = JsonDocument.Parse(json);
    
    //Print the property names.
    var names = doc.RootElement.EnumerateObject().Select(p => p.Name);
    Console.WriteLine("Property names: {0}", string.Join(",", names)); // Property names: status,message,Log_id,Log_status,FailureReason
    
    //Re-serialize with indentation.
    using var ms = new MemoryStream();
    using (var writer = new Utf8JsonWriter(ms, new JsonWriterOptions { Indented = true }))
    {
        doc.WriteTo(writer);
    }
    var json2 = Encoding.UTF8.GetString(ms.GetBuffer(), 0, checked((int)ms.Length));
    
    Console.WriteLine(json2);
  2. Was ist auch das Attributäquivalent JsonProperty?

    Attribute, die gesteuert JsonSerializerwerden können, werden im System.Text.Json.SerializationNamespace platziert und von einer abstrakten Basisklasse geerbt JsonAttribute. Im Gegensatz dazu JsonPropertygibt es kein Omnibus-Attribut, das alle Aspekte der Eigenschaftsserialisierung steuern kann. Stattdessen gibt es bestimmte Attribute, um bestimmte Aspekte zu steuern.

    Ab .NET Core 3 gehören dazu:

    • [JsonPropertyNameAttribute(string)]::

      Gibt den Eigenschaftsnamen an, der beim Serialisieren und Deserialisieren im JSON vorhanden ist. Dies überschreibt alle durch JsonNamingPolicy.

      Mit diesem Attribut möchten Sie die serialisierten Namen Ihrer ResponseJsonKlasse steuern :

      public class ResponseJson
      {
          [JsonPropertyName("status")]
          public bool Status { get; set; }
          [JsonPropertyName("message")]
          public string Message { get; set; }
          [JsonPropertyName("Log_id")]
          public string LogId { get; set; }
          [JsonPropertyName("Log_status")]
          public string LogStatus { get; set; }
      
          public string FailureReason { get; set; }
      }
    • [JsonConverterAttribute(Type)]::

      Bei Platzierung auf einem Typ wird der angegebene Konverter verwendet, es sei denn, der JsonSerializerOptions.ConvertersSammlung wird ein kompatibler Konverter hinzugefügt, oder es gibt einen anderen JsonConverterAttributefür eine Eigenschaft desselben Typs.

      Beachten Sie, dass die dokumentierte Priorität von Konvertern - Attribut für Eigenschaft, dann die Konverter-Auflistung in Optionen und dann das Attribut für Typ - von der dokumentierten Reihenfolge für Newtonsoft-Konverter abweicht , bei der es sich um den JsonConverter handelt, der durch das Attribut eines Mitglieds und dann um den JsonConverter definiert wird definiert durch ein Attribut für eine Klasse und schließlich alle an den JsonSerializer übergebenen Konverter.

    • [JsonExtensionDataAttribute]- entspricht Newtonsofts [JsonExtensionData].

    • [JsonIgnoreAttribute]- entspricht Newtonsofts [JsonIgnore].

  3. Beim Schreiben von JSON über Utf8JsonWriterkann der Einzug durch Einstellen JsonWriterOptions.Indentedauf trueoder gesteuert werden false.

    Bei der Serialisierung zu JSON über JsonSerializer.Serializekann der Einzug durch Einstellen JsonSerializerOptions.WriteIndentedauf trueoder gesteuert werden false.

Demo-Geige hier zeigt Serialisierung mit JsonSerializerund Parsing mit JsonDocument.

dbc
quelle
Danke @dbc. Sieht so aus, als würde JsonDocument.Parse für mich für JObject und JsonPropertyName für andere Dinge funktionieren. Werde meine Bewerbung morgen konvertieren und prüfen. Eine weitere Sache, die ich nach dem Äquivalent von Formating suchen werde. Kein Dank
Kamran Shahid
Vielen Dank @dbc
Kamran Shahid
2

Dieser Link soll Sie zum Laufen bringen, von denen ich unten Ausschnitte kopiert habe.

https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/

WeatherForecast Deserialize(string json) { var options = new JsonSerializerOptions { AllowTrailingCommas = true }; return JsonSerializer.Parse<WeatherForecast>(json, options); } class WeatherForecast { public DateTimeOffset Date { get; set; } // Always in Celsius. [JsonPropertyName("temp")] public int TemperatureC { get; set; } public string Summary { get; set; } // Don't serialize this property. [JsonIgnore] public bool IsHot => TemperatureC >= 30; }

Alec Ruderman
quelle
-1

Sie können dieselbe Version wie Ihr anderes Paket installieren

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

dann

services.AddControllers().AddNewtonsoftJson();
tayfun Kılıç
quelle
Was bedeutet das? Die Frage bezieht sich auf die in System.Text.json
Kamran Shahid