Konwersja kodu newtonsoft na System.Text.Json w .net core 3. co jest równoważne z JObject.Parse i JsonProperty

12

Konwertuję moją implementację newtonsoft do nowej biblioteki JSON w .net core 3.0. Mam następujący kod

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

Nie jestem w stanie znaleźć żadnego odpowiednika dla JObject.Parse(json);

Co również będzie JsonPropertyrównoważne atrybutowi

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

Jeszcze jedno będę szukał odpowiednika Formating.None.

Kamran Shahid
źródło
Zrozumiałem, że dla prostego poziomu Json jest to naprawdę proste. jeśli chodzi o rzeczy, w których używamy zagnieżdżonego jsona, niektóre formaty czasu, wartości domyślne, bezpośrednie tworzenie słownika json itp., musimy uważać i przeprowadzić odpowiednie testy jednostkowe w celu porównania wyniku przed i po konwersji
Kamran Shahid

Odpowiedzi:

15

Zadajesz tutaj kilka pytań:

  1. Nie jestem w stanie znaleźć żadnego odpowiednika dla JObject.Parse(json);

    Możesz użyć JsonDocumentdo parsowania i sprawdzania dowolnego JSON, zaczynając od jego RootElement. Element główny jest typu, JsonElementktóry reprezentuje dowolną wartość JSON (pierwotną lub nie) i odpowiada wartości Newtonsoft JToken.

    Ale zwróć uwagę na tę uwagę dokumentacji :

    Ta klasa wykorzystuje zasoby z puli pamięci, aby zminimalizować wpływ śmieciarza (GC) w scenariuszach o wysokim zużyciu. Nieprawidłowe usunięcie tego obiektu spowoduje, że pamięć nie zostanie zwrócona do puli, co zwiększy wpływ GC na różne części frameworka.

    Jeśli chcesz użyć dokumentu JsonElementpoza cyklem życia, musisz go sklonować :

    Pobiera plik, JsonElementktóry można bezpiecznie przechowywać poza okresem użytkowania oryginału JsonDocument.

    Należy również pamiętać, że JsonDocumentobecnie jest tylko do odczytu i nie zapewnia interfejsu API do tworzenia lub modyfikowania JSON. Istnieje otwarty problem Problem nr 39922: Zapisywalny DOM Json śledzący to.

    Przykład użycia jest następujący:

    //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. Co również będzie JsonPropertyrównoważne atrybutowi ?

    Atrybuty, które można kontrolować, JsonSerializersą umieszczane w System.Text.Json.Serializationprzestrzeni nazw i dziedziczą po abstrakcyjnej klasie bazowej JsonAttribute. W przeciwieństwie do tego JsonProperty, nie ma atrybutu omnibus, który mógłby kontrolować wszystkie aspekty serializacji właściwości. Zamiast tego istnieją określone atrybuty kontrolujące określone aspekty.

    Od .NET Core 3 obejmują one:

    • [JsonPropertyNameAttribute(string)]:

      Określa nazwę właściwości, która jest obecna w JSON podczas serializacji i deserializacji. To zastępuje wszelkie zasady nazewnictwa określone przez JsonNamingPolicy.

      Jest to atrybut, którego chcesz użyć do sterowania serializowanymi nazwami swojej ResponseJsonklasy:

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

      Po umieszczeniu na typie zostanie użyty określony konwerter, chyba że do JsonSerializerOptions.Converterskolekcji zostanie dodany kompatybilny konwerter lub istnieje inna JsonConverterAttributewłaściwość tego samego typu.

      Należy zauważyć, że udokumentowany priorytet konwerterów - Atrybut na właściwość, następnie kolekcja Konwertery w opcjach, a następnie Atrybut na typ - różni się od udokumentowanej kolejności konwerterów Newtonsoft , którą jest JsonConverter zdefiniowany przez atrybut na elemencie, a następnie JsonConverter zdefiniowane przez atrybut klasy, a na koniec wszelkie konwertery przekazane do JsonSerializer.

    • [JsonExtensionDataAttribute]- odpowiada Newtonoftowi [JsonExtensionData].

    • [JsonIgnoreAttribute]- odpowiada Newtonoftowi [JsonIgnore].

  3. Podczas pisania JSON przez Utf8JsonWriterwcięcie można kontrolować, ustawiając JsonWriterOptions.Indentedna truelub false.

    Podczas szeregowania do JSON przez JsonSerializer.Serialize, wcięcie może być kontrolowane poprzez ustawienie JsonSerializerOptions.WriteIndentedna truelub false.

Demonstracyjne skrzypce tutaj pokazujące serializację JsonSerializerzi parsowanie JsonDocument.

dbc
źródło
Dzięki @dbc. Wygląda na to, że JsonDocument.Parse będzie dla mnie działał dla JObject i JsonPropertyName dla innych rzeczy. Konwertuje moją aplikację jutro i sprawdzi. Jeszcze jedno będę szukał odpowiednika Formowania. Żadne dzięki
Kamran Shahid
Wielkie dzięki @dbc
Kamran Shahid
2

Ten link powinien Cię zabrać, fragmenty, które skopiowałem poniżej.

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
źródło
-1

Możesz w tej samej wersji zainstalować drugi pakiet

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

następnie

services.AddControllers().AddNewtonsoftJson();
tayfun Kılıç
źródło
Co to znaczy? Pytanie dotyczy opcji dostępnej w System.Text.json
Kamran Shahid