Chuyển đổi mã newtonsoft sang System.Text.Json trong lõi .net 3. tương đương với JObject.Pude và JsonProperty


12

Tôi đang chuyển đổi triển khai newtonsoft của mình sang thư viện JSON mới trong .net core 3.0. Tôi có đoạn mã sau

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

Tôi không thể tìm thấy bất kỳ tương đương cho JObject.Parse(json);

Ngoài ra những gì sẽ là thuộc tính JsonPropertytương đương

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

Một điều nữa tôi sẽ tìm kiếm tương đương Formating.None.


Những gì tôi hiểu là cho json cấp độ đơn giản, nó thực sự đơn giản. đối với những thứ mà chúng tôi đã sử dụng một số json lồng nhau, một số định dạng thời gian, giá trị mặc định, tạo json trực tiếp từ điển, v.v. chúng tôi phải chăm sóc và kiểm tra đơn vị thích hợp để so sánh kết quả trước và sau khi chuyển đổi
Kamran Shahid

Câu trả lời:


15

Bạn đang hỏi một vài câu hỏi ở đây:

  1. Tôi không thể tìm thấy bất kỳ tương đương cho JObject.Parse(json);

    Bạn có thể sử dụng JsonDocumentđể phân tích và kiểm tra bất kỳ JSON nào, bắt đầu với JSON RootElement. Phần tử gốc có kiểu JsonElementđại diện cho bất kỳ giá trị JSON nào (nguyên thủy hay không) và tương ứng với Newtonsoft JToken.

    Nhưng hãy lưu ý tài liệu này nhận xét :

    Lớp này sử dụng các tài nguyên từ bộ nhớ gộp để giảm thiểu tác động của trình thu gom rác (GC) trong các tình huống sử dụng cao. Việc không xử lý đúng đối tượng này sẽ dẫn đến việc bộ nhớ không được đưa trở lại nhóm, điều này sẽ làm tăng tác động của GC trên các phần khác nhau của khung.

    Khi bạn cần sử dụng JsonElementngoài vòng đời của tài liệu, bạn phải sao chép nó:

    Nhận được một JsonElementcó thể được lưu trữ an toàn ngoài vòng đời của bản gốc JsonDocument.

    Cũng lưu ý rằng JsonDocumenthiện chỉ đọc và không cung cấp API để tạo hoặc sửa đổi JSON. Có một vấn đề mở Vấn đề # 39922: Json DOM có thể ghi được theo dõi này.

    Một ví dụ về việc sử dụng như sau:

    //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. Ngoài ra những gì sẽ là thuộc tính JsonPropertytương đương?

    Các thuộc tính có thể điều khiển JsonSerializerđược đặt trong System.Text.Json.Serializationkhông gian tên và kế thừa từ một lớp cơ sở trừu tượng JsonAttribute. Không giống như JsonProperty, không có thuộc tính omnibus nào có thể kiểm soát tất cả các khía cạnh của tuần tự hóa tài sản. Thay vào đó là các thuộc tính cụ thể để kiểm soát các khía cạnh cụ thể.

    Kể từ .NET Core 3, chúng bao gồm:

    • [JsonPropertyNameAttribute(string)]:

      Chỉ định tên thuộc tính có trong JSON khi tuần tự hóa và giải tuần tự hóa. Điều này ghi đè bất kỳ chính sách đặt tên được chỉ định bởi JsonNamingPolicy.

      Đây là thuộc tính bạn muốn sử dụng để kiểm soát các tên được xê-ri hóa của ResponseJsonlớp bạn :

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

      Khi được đặt trên một loại, bộ chuyển đổi được chỉ định sẽ được sử dụng trừ khi bộ chuyển đổi tương thích được thêm vào JsonSerializerOptions.Convertersbộ sưu tập hoặc có một loại khác JsonConverterAttributetrên một thuộc tính cùng loại.

      Lưu ý rằng mức độ ưu tiên được ghi thành tài liệu của bộ chuyển đổi - Thuộc tính trên thuộc tính, sau đó là bộ sưu tập Bộ chuyển đổi trong các tùy chọn, sau đó là Thuộc tính trên loại - khác với thứ tự được ghi thành tài liệu cho bộ chuyển đổi Newtonsoft , đó là JsonConverter được xác định bởi thuộc tính trên thành viên, sau đó là JsonConverter được xác định bởi một thuộc tính trên một lớp và cuối cùng là bất kỳ trình chuyển đổi nào được chuyển đến JsonSerializer.

    • [JsonExtensionDataAttribute]- tương ứng với Newtonsoft [JsonExtensionData].

    • [JsonIgnoreAttribute]- tương ứng với Newtonsoft [JsonIgnore].

  3. Khi viết JSON thông qua Utf8JsonWriter, thụt lề có thể được kiểm soát bằng cách đặt JsonWriterOptions.Indentedthành truehoặc false.

    Khi tuần tự hóa sang JSON thông qua JsonSerializer.Serialize, thụt lề có thể được kiểm soát bằng cách đặt JsonSerializerOptions.WriteIndentedthành truehoặc false.

Demo fiddle ở đây hiển thị serialization với JsonSerializervà phân tích cú pháp với JsonDocument.


Cảm ơn @dbc. Có vẻ như JsonDocument.Pude sẽ làm việc cho tôi cho JObject và JsonPropertyName cho những thứ khác. Sẽ chuyển đổi ứng dụng của tôi vào ngày mai và sẽ kiểm tra. Một điều nữa tôi sẽ tìm kiếm tương đương với Formating. Cảm ơn
Kamran Shahid

Cảm ơn rất nhiều @dbc
Kamran Shahid

2

Liên kết này sẽ giúp bạn đi, đoạn trích mà tôi đã sao chép bên dưới.

https://devbloss.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

Bạn có thể cùng phiên bản cài đặt gói khác của bạn

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

sau đó

services.AddControllers().AddNewtonsoftJson();

Cái này nghĩa là gì? Câu hỏi là về tùy chọn có sẵn trong System.Text.json
Kamran Shahid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.