Conversione del codice newtonsoft in System.Text.Json in .net core 3. Qual è l'equivalente di JObject.Parse e JsonProperty


12

Sto convertendo la mia implementazione newtonsoft in una nuova libreria JSON in .net core 3.0. Ho il codice seguente

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

Non riesco a trovare alcun equivalente per JObject.Parse(json);

Inoltre quale sarà l'attributo JsonPropertyequivalente

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

Un'altra cosa che cercherò per l'equivalente di Formating.None.


Quello che ho capito è per Json di livello semplice, è davvero semplice. per le cose in cui abbiamo usato un json nidificato, alcuni formati temporali, valori predefiniti, creazione del json diretta nel dizionario ecc. dobbiamo fare attenzione e fare test di unità adeguati per confrontare il risultato prima e dopo la conversione
Kamran Shahid,

Risposte:


15

Stai ponendo alcune domande qui:

  1. Non riesco a trovare alcun equivalente per JObject.Parse(json);

    È possibile utilizzare JsonDocumentper analizzare ed esaminare qualsiasi JSON, a partire dal suo RootElement. L'elemento root è di tipo JsonElementche rappresenta qualsiasi valore JSON (primitivo o meno) e corrisponde a quello di Newtonsoft JToken.

    Ma prendi nota di questa osservazione della documentazione :

    Questa classe utilizza risorse della memoria in pool per ridurre al minimo l'impatto del Garbage Collector (GC) in scenari di utilizzo elevato. Se non si smaltisce correttamente questo oggetto, la memoria non verrà restituita al pool, aumentando l'impatto del GC su varie parti del framework.

    Quando è necessario utilizzare una JsonElementdurata esterna al suo documento, è necessario clonarlo :

    Ottiene un oggetto JsonElementche può essere archiviato in modo sicuro oltre la durata dell'originale JsonDocument.

    Si noti inoltre che al JsonDocumentmomento è di sola lettura e non fornisce un'API per la creazione o la modifica di JSON. Esiste un problema aperto N. 39922: DOM Json scrivibile che sta monitorando questo.

    Un esempio di utilizzo è il seguente:

    //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. Inoltre quale sarà l'attributo JsonPropertyequivalente?

    Gli attributi che possono controllare JsonSerializersono collocati nello System.Text.Json.Serializationspazio dei nomi ed ereditano da una classe base astratta JsonAttribute. Diversamente JsonProperty, non esiste alcun attributo omnibus in grado di controllare tutti gli aspetti della serializzazione delle proprietà. Esistono invece attributi specifici per controllare aspetti specifici.

    A partire da .NET Core 3 questi includono:

    • [JsonPropertyNameAttribute(string)]:

      Specifica il nome della proprietà presente in JSON durante la serializzazione e la deserializzazione. Questo sostituisce qualsiasi politica di denominazione specificata da JsonNamingPolicy.

      Questo è l'attributo che desideri utilizzare per controllare i nomi serializzati della tua 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)]:

      Se posizionato su un tipo, verrà utilizzato il convertitore specificato a meno che non venga aggiunto un convertitore compatibile alla JsonSerializerOptions.Convertersraccolta o ce ne sia un altro JsonConverterAttributesu una proprietà dello stesso tipo.

      Si noti che la priorità documentata dei convertitori - Attributo sulla proprietà, quindi la raccolta Convertitori nelle opzioni, quindi l'attributo sul tipo - differisce dall'ordine documentato per i convertitori Newtonsoft , che è il JsonConverter definito dall'attributo su un membro, quindi JsonConverter definito da un attributo su una classe e infine tutti i convertitori passati a JsonSerializer.

    • [JsonExtensionDataAttribute]- corrisponde a Newtonsoft [JsonExtensionData].

    • [JsonIgnoreAttribute]- corrisponde a Newtonsoft [JsonIgnore].

  3. Quando si scrive JSON tramite Utf8JsonWriter, il rientro può essere controllato impostando JsonWriterOptions.Indentedsu trueo false.

    Quando si serializza su JSON tramite JsonSerializer.Serialize, il rientro può essere controllato impostando JsonSerializerOptions.WriteIndentedsu trueo false.

Demo di violino qui che mostra la serializzazione JsonSerializere l'analisi con JsonDocument.


Grazie @dbc. Sembra che JsonDocument.Parse funzionerà per me per JObject e JsonPropertyName per altre cose. Convertirò la mia domanda domani e controllerò. Ancora una cosa cercherò l'equivalente di Formating.Nessuno grazie
Kamran Shahid

Grazie mille @dbc
Kamran Shahid,

2

Questo link dovrebbe iniziare, frammenti di cui ho copiato di seguito.

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


-1

Puoi installare la stessa versione dell'altro pacchetto

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

poi

services.AddControllers().AddNewtonsoftJson();

Cosa significa questo? La domanda è sull'opzione disponibile in System.Text.json
Kamran Shahid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.