19 votes

La conversion du code newtonsoft en System.Text.Json dans .net core 3. Quel est l'équivalent de JObject.Parse et de JsonProperty ?

Je suis en train de convertir 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 n'ai pas trouvé d'é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 : je chercherai l'équivalent de Formating.None .

24voto

dbc Points 3449

Vous posez ici quelques questions :

  1. Je n'ai pas trouvé d'équivalent pour JObject.Parse(json);

    Vous pouvez utiliser JsonDocument à analyser et examiner tout JSON, en commençant par son RootElement . L'élément Racine est de type JsonElement qui représente n'importe quelle valeur JSON (primitive ou non) et correspond à l'élément JToken .

    Mais prenez note de cette documentation remarque :

    Cette classe utilise les ressources de la mémoire commune pour minimiser l'impact du ramasse-miettes (GC) dans les scénarios de forte utilisation. Si cet objet n'est pas correctement disposé, la mémoire ne sera pas restituée au pool, ce qui augmentera l'impact du GC dans les différentes parties du framework.

    Lorsque vous devez utiliser un JsonElement en dehors de la durée de vie de son document, vous devez clone il :

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

    Il convient également de noter que JsonDocument est actuellement en lecture seule et ne fournit pas d'API pour la création ou la modification de JSON. Il existe un problème ouvert Problème n°39922 : DOM Json inscriptible le suivi de la situation.

    Voici un exemple d'utilisation :

    //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 ?

    Attributs pouvant être contrôlés JsonSerializer sont placés dans le System.Text.Json.Serialization et héritent d'une classe de base abstraite JsonAttribute . Contrairement à JsonProperty Il n'existe pas d'attribut omnibus permettant de contrôler tous les aspects de la sérialisation des biens. Au lieu de cela, il existe des attributs spécifiques permettant de contrôler des aspects particuliers.

    À partir de .NET Core 3, il s'agit des éléments suivants

    • [JsonPropertyNameAttribute(string)] :

      Spécifie le nom de la propriété qui est présent dans le JSON lors de la sérialisation et de la désérialisation. Ce nom est prioritaire sur toute politique de dénomination spécifiée par JsonNamingPolicy .

      Il s'agit de l'attribut que vous souhaitez utiliser pour contrôler les noms sérialisés de votre ResponseJson classe :

      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é à moins qu'un convertisseur compatible ne soit ajouté à l'attribut JsonSerializerOptions.Converters ou qu'il existe une autre JsonConverterAttribute sur une propriété du même type.

      Il convient de noter que le 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 Convertisseurs Newtonsoft qui est le JsonConverter défini par un 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 à celle de Newtonsoft [JsonExtensionData] .

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

  3. Lors de l'écriture de JSON via Utf8JsonWriter L'indentation peut être contrôlée en définissant JsonWriterOptions.Indented à true o false .

    Lors de la sérialisation en JSON via JsonSerializer.Serialize L'indentation peut être contrôlée en définissant JsonSerializerOptions.WriteIndented à true o false .

Démonstration de violon aquí montrant la sérialisation avec JsonSerializer et l'analyse syntaxique avec JsonDocument .

2voto

Alec Ruderman Points 11

Ce lien devrait vous permettre d'aller de l'avant, et j'en ai copié des extraits 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;

}`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X