Conversion du code newtonsoft en System.Text.Json dans .net core 3. ce qui est équivalent à JObject.Parse et JsonProperty

12

Je convertis mon implémentation newtonsoft en une nouvelle bibliothèque JSON dans .net core 3.0. J'ai le code suivant

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;
    }
}

Je ne trouve aucun équivalent pour JObject.Parse(json);

Quel sera également l'attribut 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; }
}

Une dernière chose que je chercherai pour l'équivalent de Formating.None.

Kamran Shahid
la source
Ce que j'ai compris, c'est pour un simple niveau json, c'est vraiment simple. pour les choses où nous avons utilisé du json imbriqué, des formats d'heure, des valeurs par défaut, la création de json direct de dictionnaire, etc., nous devons prendre soin et faire des tests unitaires appropriés pour comparer le résultat avant et après la conversion
Kamran Shahid

Réponses:

15

Vous posez quelques questions ici:

  1. Je ne trouve aucun équivalent pour JObject.Parse(json);

    Vous pouvez utiliser JsonDocumentpour analyser et examiner n'importe quel JSON, en commençant par son RootElement. L'élément racine est de type JsonElementqui représente toute valeur JSON (primitive ou non) et correspond à Newtonsoft JToken.

    Mais prenez note de cette remarque de documentation :

    Cette classe utilise les ressources de la mémoire en pool pour minimiser l'impact du garbage collector (GC) dans les scénarios à forte utilisation. Si vous ne disposez pas correctement de cet objet, la mémoire ne sera pas renvoyée dans le pool, ce qui augmentera l'impact du GC sur différentes parties du cadre.

    Lorsque vous devez utiliser un JsonElementélément externe pendant la durée de vie de son document, vous devez le cloner :

    Obtient un JsonElementqui peut être stocké en toute sécurité au-delà de la durée de vie de l'original JsonDocument.

    Notez également qu'il JsonDocumentest actuellement en lecture seule et ne fournit pas d'API pour créer ou modifier JSON. Il existe un problème ouvert Problème n ° 39922: DOM Json accessible en écriture qui suit ce problème .

    Un exemple d'utilisation est le suivant:

    //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. Quel sera également l'attribut JsonPropertyéquivalent?

    Les attributs qui peuvent contrôler JsonSerializersont placés dans l' System.Text.Json.Serializationespace de noms et héritent d'une classe de base abstraite JsonAttribute. Contrairement à JsonProperty, aucun attribut omnibus ne peut contrôler tous les aspects de la sérialisation des propriétés. Au lieu de cela, il existe des attributs spécifiques pour contrôler des aspects spécifiques.

    À partir de .NET Core 3, ils incluent:

    • [JsonPropertyNameAttribute(string)]:

      Spécifie le nom de propriété présent dans le JSON lors de la sérialisation et de la désérialisation. Cela remplace toute stratégie de dénomination spécifiée parJsonNamingPolicy .

      C'est l'attribut que vous souhaitez utiliser pour contrôler les noms sérialisés de votre ResponseJsonclasse:

      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)]:

      Lorsqu'il est placé sur un type, le convertisseur spécifié sera utilisé sauf si un convertisseur compatible est ajouté à la JsonSerializerOptions.Converterscollection ou s'il y en a un autreJsonConverterAttribute sur une propriété du même type.

      Notez que la priorité documentée des convertisseurs - Attribut sur la propriété, puis la collection Convertisseurs dans les options, puis l'attribut sur le type - diffère de l'ordre documenté pour les convertisseurs Newtonsoft , qui est le JsonConverter défini par attribut sur un membre, puis le JsonConverter défini par un attribut sur une classe, et enfin tous les convertisseurs passés au JsonSerializer.

    • [JsonExtensionDataAttribute]- correspond à Newtonsoft [JsonExtensionData].

    • [JsonIgnoreAttribute]- correspond à Newtonsoft [JsonIgnore].

  3. Lors de l'écriture de JSON via Utf8JsonWriter, l'indentation peut être contrôlée en définissant JsonWriterOptions.Indentedsurtrue ou false.

    Lors de la sérialisation vers JSON via JsonSerializer.Serialize, l'indentation peut être contrôlée en définissant JsonSerializerOptions.WriteIndentedsur trueou false.

Démonstration de violon ici montrant la sérialisation JsonSerializeret l'analyse avec JsonDocument.

dbc
la source
Merci @dbc. On dirait que JsonDocument.Parse fonctionnera pour moi pour JObject et JsonPropertyName pour autre chose. Convertira mon application demain et vérifiera. Une dernière chose que je chercherai pour l'équivalent de Formating.None Thanks
Kamran Shahid
Merci beaucoup @dbc
Kamran Shahid
2

Ce lien devrait vous aider à démarrer, extraits que j'ai copiés ci-dessous.

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
la source
-1

Vous pouvez même installer votre autre package

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

puis

services.AddControllers().AddNewtonsoftJson();
tayfun Kılıç
la source
Qu'est-ce que cela signifie? La question concerne l'option disponible dans System.Text.json
Kamran Shahid