Перетворення коду newtonsoft в System.Text.Json в ядро ​​.net 3. що еквівалентно JObject.Parse та JsonProperty


12

Я перетворюю свою реалізацію newtonsoft в нову бібліотеку JSON в .net core 3.0. У мене є такий код

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

Я не в змозі знайти жодного еквівалента для JObject.Parse(json);

Також JsonPropertyеквівалент атрибуту

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

Ще одне, що я буду шукати еквівалент Formating.None.


Те, що я зрозумів, для простого json рівня це дуже просто. для речей, де ми використовуємо вкладений json, деякі формати часу, значення за замовчуванням, створення прямого словника json тощо., ми повинні подбати і зробити належне тестування для порівняння результатів до та після перетворення
Камран Шахід

Відповіді:


15

Ви задаєте тут кілька питань:

  1. Я не в змозі знайти жодного еквівалента для JObject.Parse(json);

    Ви можете використовувати JsonDocumentдля розбору та вивчення будь-якого JSON, починаючи з його RootElement. Кореневий елемент має тип, JsonElementякий представляє будь-яке значення JSON (примітивне чи ні) та відповідає Newtonsoft JToken.

    Але врахуйте це зауваження щодо документації :

    Цей клас використовує ресурси з об'єднаної пам'яті, щоб мінімізувати вплив сміттєзбірника (СК) у сценарії з високим рівнем використання. Якщо неправильно розмістити цей об'єкт, це призведе до того, що пам'ять не повернеться до пулу, що збільшить вплив GC у різних частинах структури.

    Коли вам потрібно використовувати JsonElementзовнішній термін експлуатації його документа, його потрібно клонувати :

    Отримує JsonElementте, що можна безпечно зберігати за межі терміну експлуатації оригіналу JsonDocument.

    Також зауважте, що JsonDocumentнаразі лише для читання та не надає API для створення або зміни JSON. Випуск № 39922 з відкритим доступом Json DOM для відстеження цього питання.

    Приклад використання такий:

    //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. Також який буде JsonPropertyеквівалент атрибута ?

    Атрибути, якими можна керувати JsonSerializer, розміщуються у System.Text.Json.Serializationпросторі імен та успадковуються від абстрактного базового класу JsonAttribute. На відміну від JsonPropertyцього, немає атрибута омнібус, який би міг контролювати всі аспекти серіалізації властивостей. Натомість існують конкретні атрибути для контролю конкретних аспектів.

    Станом на .NET Core 3 до них належать:

    • [JsonPropertyNameAttribute(string)]:

      Вказує ім'я властивості, яке присутнє в JSON при серіалізації та десеріалізації. Це перекриває будь-яку політику іменування, визначену JsonNamingPolicy.

      Це атрибут, який ви хочете використовувати для керування серіалізованими іменами свого ResponseJsonкласу:

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

      Якщо розміщується на типі, зазначений перетворювач буде використовуватися, якщо сумісний перетворювач не доданий до JsonSerializerOptions.Convertersколекції чи є інший JsonConverterAttributeу властивості того ж типу.

      Зауважте, що задокументований пріоритет перетворювачів - Атрибут на властивості, потім Колекція перетворювачів у параметрах, потім Атрибут за типом - відрізняється від документально підтвердженого порядку для перетворювачів Ньютонсофт , що є JsonConverter, визначеним атрибутом члена, а потім JsonConverter визначений атрибутом класу, і, нарешті, будь-який перетворювач передається JsonSerializer.

    • [JsonExtensionDataAttribute]- відповідає Newtonsoft's [JsonExtensionData].

    • [JsonIgnoreAttribute]- відповідає Newtonsoft's [JsonIgnore].

  3. Під час написання JSON через Utf8JsonWriterвідступ можна керувати, встановивши JsonWriterOptions.Indentedна trueабо false.

    При серіалізації в JSON через JsonSerializer.Serializeвідступ можна керувати, встановивши JsonSerializerOptions.WriteIndentedна trueабо false.

Демо-скрипка тут демонструє серіалізацію JsonSerializerта розбір з JsonDocument.


Дякую @dbc. Схоже, JsonDocument.Parse буде працювати для мене для JObject, а JsonPropertyName для іншого. Завтра перетворять мою заявку і перевірять. Ще одне, що я буду шукати еквівалент Форматування.
Камран Шахід

Велике спасибі @dbc
Kamran Shahid

2

За цим посиланням слід перейти, фрагменти якого я скопіював нижче.

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

Ви можете встановити іншу версію свого іншого пакета

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

тоді

services.AddControllers().AddNewtonsoftJson();

Що це означає? Питання про варіант, доступний у System.Text.json
Камран Шахід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.