Newtonsoft kodunu .net core 3'te System.Text.Json'a dönüştürme JObject.Parse ve JsonProperty'nin eşdeğeri


12

Newtonsoft uygulamasını .net core 3.0'daki yeni JSON kitaplığına dönüştürüyorum. Takip koduna sahibim

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

İçin herhangi bir eşdeğeri bulamıyorum JObject.Parse(json);

Ayrıca JsonPropertyeşdeğer nitelik ne olacak

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

Eşdeğer arayacağım bir şey daha Formating.None.


Anladığım şey basit seviye json için gerçekten basit. bazı yuvalanmış json, bazı zaman formatları, varsayılan değerler, sözlük doğrudan json oluşturma vb kullandığımız şeyler için, dönüşümden önce ve sonra sonucu karşılaştırmak için dikkat etmeli ve uygun birim testi yapmalıyız
Kamran Shahid

Yanıtlar:


15

Burada birkaç soru soruyorsunuz:

  1. İçin herhangi bir eşdeğeri bulamıyorum JObject.Parse(json);

    Herhangi bir JSON'u onunla başlayarak ayrıştırmak ve incelemek JsonDocumentiçin kullanabilirsiniz . Kök öğe, herhangi bir JSON değerini (ilkel veya değil) temsil eden ve Newtonsoft değerlerine karşılık gelen türdedir . RootElementJsonElementJToken

    Ama bu belgeler dikkat do sözler :

    Bu sınıf, yüksek kullanım senaryolarında çöp toplayıcının (GC) etkisini en aza indirmek için havuzlanmış bellekten kaynakları kullanır. Bu nesnenin uygun şekilde imha edilmemesi, belleğin havuza geri gönderilmemesine neden olur ve bu da çerçevenin çeşitli bölümlerinde GC etkisini artıracaktır.

    JsonElementBelgesinin ömrünün dışında bir dış mekan kullanmanız gerektiğinde, bunu klonlamanız gerekir:

    Bir alır JsonElementgüvenle orijinal ömrü ötesinde saklanabilir o JsonDocument.

    Ayrıca JsonDocument, şu anda salt okunur olduğunu ve JSON oluşturmak veya değiştirmek için bir API sağlamadığını da unutmayın . Açık bir sorun var Sorun # 39922: Yazılabilir Json DOM bunu izliyor .

    Kullanım örneği aşağıdaki gibidir:

    //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. Ayrıca öznitelik JsonPropertyeşdeğeri ne olacak ?

    Kontrol edebilen öznitelikler ad alanına JsonSerializeryerleştirilir System.Text.Json.Serializationve soyut bir temel sınıftan devralınır JsonAttribute. Bunun aksine JsonProperty, özellik serileştirmesinin tüm yönlerini kontrol edebilen omnibus niteliği yoktur. Bunun yerine, belirli yönleri kontrol etmek için belirli özellikler vardır.

    .NET Core 3'ten itibaren bunlar:

    • [JsonPropertyNameAttribute(string)]:

      Serileştirirken ve serileştirmeyi kaldırırken JSON'da bulunan özellik adını belirtir. Bu, tarafından belirtilen tüm adlandırma ilkelerini geçersiz kılar JsonNamingPolicy.

      Bu, ResponseJsonsınıfınızın serileştirilmiş adlarını kontrol etmek için kullanmak istediğiniz özelliktir :

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

      Bir türe yerleştirildiğinde, JsonSerializerOptions.Converterskoleksiyona uyumlu bir dönüştürücü eklenmedikçe veya JsonConverterAttributeaynı türde bir özellikte başka bir dönüştürücü yoksa belirtilen dönüştürücü kullanılır .

      Not o dönüştürücüler belgelenmiş önceliği - mülkiyet Özellik, daha sonra seçeneklerinde Dönüştürücüler toplanması, türüne sonra Özellik - için belgelenmiş düzenden farklıdır Newtonsoft dönüştürücüler vardır , sonra JsonConverter bir üyesinde özniteliği tarafından tanımlanan JsonConverter sınıftaki bir öznitelik tarafından tanımlanır ve son olarak tüm dönüştürücüler JsonSerializer'a iletilir.

    • [JsonExtensionDataAttribute]- Newtonsoft'unkine karşılık gelir [JsonExtensionData].

    • [JsonIgnoreAttribute]- Newtonsoft'unkine karşılık gelir [JsonIgnore].

  3. JSON yoluyla yazılı zaman Utf8JsonWriter, girinti ayarlayarak kontrol edilebilir JsonWriterOptions.Indentediçin trueya false.

    JSON Via seri zaman JsonSerializer.Serialize, girinti ayarlayarak kontrol edilebilir JsonSerializerOptions.WriteIndentediçin trueya false.

Demo keman burada serileştirme gösteren JsonSerializerve ile ayrıştırma JsonDocument.


Teşekkürler @dbc. JsonDocument.Parse benim için JObject ve JsonPropertyName için başka bir şey için çalışacak gibi görünüyor. Yarın başvurumu dönüştürecek ve kontrol edecek. Bir şey daha Formating.None Thanks eşdeğer arıyoruz olacak
Kamran Shahid


2

Bu bağlantı sizi kopyalamalı, aşağıda kopyaladığım parçacıkları.

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

Diğer paket yüklemenizle aynı sürümü yapabilirsiniz

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

sonra

services.AddControllers().AddNewtonsoftJson();

Bu ne demek? Soru System.Text.json'da mevcut seçenek hakkında
Kamran Shahid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.