Mengubah kode newtonsoft ke System.Text.Json di .net core 3. apa yang setara dengan JObject.Parse dan JsonProperty

12

Saya mengubah implementasi newtonsoft saya ke perpustakaan JSON baru di .net core 3.0. Saya memiliki kode berikut

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

Saya tidak dapat menemukan yang setara untuk JObject.Parse(json);

Juga apa yang akan menjadi atribut yang JsonPropertysetara

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

Satu hal lagi saya akan mencari yang setara Formating.None.

Kamran Shahid
sumber
Apa yang saya mengerti adalah untuk json tingkat sederhana itu sangat mudah. untuk hal-hal di mana kita telah menggunakan json bersarang, beberapa format waktu, nilai default, pembuatan kamus json langsung dll kita harus berhati-hati dan melakukan pengujian unit yang tepat untuk membandingkan hasil sebelum dan setelah konversi
Kamran Shahid

Jawaban:

15

Anda mengajukan beberapa pertanyaan di sini:

  1. Saya tidak dapat menemukan yang setara untuk JObject.Parse(json);

    Anda bisa menggunakan JsonDocumentuntuk mem - parsing dan memeriksa JSON apa saja, dimulai dengan RootElement. Elemen root adalah tipe JsonElementyang mewakili nilai JSON (primitif atau tidak) dan sesuai dengan Newtonsoft JToken.

    Tetapi perhatikan komentar dokumentasi ini :

    Kelas ini menggunakan sumber daya dari pooled memory untuk meminimalkan dampak pengumpul sampah dalam skenario penggunaan tinggi. Kegagalan untuk membuang objek ini dengan benar akan mengakibatkan memori tidak dikembalikan ke kolam, yang akan meningkatkan dampak GC di berbagai bagian kerangka kerja.

    Saat Anda perlu menggunakan dokumen di JsonElementluar masa pakainya, Anda harus mengkloningnya :

    Mendapat a JsonElementyang dapat disimpan dengan aman melampaui umur aslinya JsonDocument.

    Perhatikan juga bahwa JsonDocumentsaat ini hanya-baca dan tidak menyediakan API untuk membuat atau memodifikasi JSON. Ada masalah terbuka Masalah # 39922: Writable Json DOM yang melacak ini.

    Contoh penggunaan adalah sebagai berikut:

    //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. Juga apa yang akan menjadi atribut yang JsonPropertysetara?

    Atribut yang dapat mengontrol JsonSerializerditempatkan di System.Text.Json.Serializationnamespace dan mewarisi dari kelas dasar abstrak JsonAttribute. Tidak seperti JsonProperty, tidak ada atribut omnibus yang dapat mengontrol semua aspek serialisasi properti. Sebaliknya ada atribut khusus untuk mengontrol aspek tertentu.

    Pada .NET Core 3 ini meliputi:

    • [JsonPropertyNameAttribute(string)]:

      Menentukan nama properti yang ada di JSON saat membuat serial dan deserializing. Ini mengabaikan semua kebijakan penamaan yang ditentukan oleh JsonNamingPolicy.

      Ini adalah atribut yang ingin Anda gunakan untuk mengontrol nama serial dari ResponseJsonkelas Anda :

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

      Ketika ditempatkan pada suatu jenis, konverter yang ditentukan akan digunakan kecuali jika konverter yang kompatibel ditambahkan ke JsonSerializerOptions.Converterskoleksi atau ada yang lain JsonConverterAttributepada properti dengan tipe yang sama.

      Perhatikan bahwa prioritas konverter yang didokumentasikan - Atribut pada properti, lalu koleksi Konverter dalam opsi, kemudian Atribut pada jenis - berbeda dari urutan yang didokumentasikan untuk konverter Newtonsoft , yang merupakan JsonConverter yang ditentukan oleh atribut pada anggota, kemudian JsonConverter didefinisikan oleh atribut pada kelas, dan akhirnya setiap konverter diteruskan ke JsonSerializer.

    • [JsonExtensionDataAttribute]- sesuai dengan Newtonsoft [JsonExtensionData].

    • [JsonIgnoreAttribute]- sesuai dengan Newtonsoft [JsonIgnore].

  3. Saat menulis JSON via Utf8JsonWriter, indentasi dapat dikontrol dengan mengatur JsonWriterOptions.Indentedke trueatau false.

    Saat membuat serial ke JSON via JsonSerializer.Serialize, lekukan dapat dikontrol dengan mengatur JsonSerializerOptions.WriteIndentedke trueatau false.

Demo biola di sini menunjukkan serialisasi dengan JsonSerializerdan penguraian JsonDocument.

dbc
sumber
Terima kasih @dbc. Sepertinya JsonDocument.Parse akan bekerja untuk saya untuk JObject dan JsonPropertyName untuk hal lainnya. Akan mengonversi aplikasi saya besok dan akan memeriksa. Satu hal lagi saya akan mencari yang setara dengan Formating. Tidak Ada Terima Kasih
Kamran Shahid
Terima kasih banyak @dbc
Kamran Shahid
2

Tautan ini akan membantu Anda, cuplikan yang saya salin di bawah.

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
sumber
-1

Anda dapat menginstal versi yang sama dengan paket lainnya

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

kemudian

services.AddControllers().AddNewtonsoftJson();
tayfun Kılıç
sumber
Apa ini artinya? Pertanyaannya adalah tentang opsi yang tersedia di System.Text.json
Kamran Shahid