Преобразование кода 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 в словарях и т. д., мы должны позаботиться и выполнить надлежащее модульное тестирование для сравнения результатов до и после преобразования
Kamran Shahid

Ответы:

15

Вы задаете несколько вопросов здесь:

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

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

    Но обратите внимание на это замечание по документации :

    Этот класс использует ресурсы из объединенной памяти, чтобы минимизировать влияние сборщика мусора (GC) в сценариях с высокой нагрузкой. Неправильная утилизация этого объекта приведет к тому, что память не будет возвращена в пул, что увеличит влияние 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, отсутствует атрибут omnibus, который может управлять всеми аспектами сериализации свойств. Вместо этого есть определенные атрибуты для управления конкретными аспектами.

    Начиная с .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в свойстве того же типа есть другой .

      Обратите внимание, что задокументированный приоритет конвертеров - Атрибут для свойства, затем коллекция Конвертеры в опциях, затем Атрибут для типа - отличается от документированного порядка для конвертеров Newtonsoft , который JsonConverter, определяемым атрибутом для члена, а затем JsonConverter. определяется атрибутом класса, и, наконец, любые преобразователи передаются в JsonSerializer.

    • [JsonExtensionDataAttribute]- соответствует Ньютонсофт [JsonExtensionData].

    • [JsonIgnoreAttribute]- соответствует Ньютонсофт [JsonIgnore].

  3. При написании JSON через Utf8JsonWriterотступ можно управлять настройкойJsonWriterOptions.Indented на trueили false.

    При сериализации в JSON Via JsonSerializer.Serialize, отступы можно регулировать путем установки JsonSerializerOptions.WriteIndentedна trueилиfalse .

Демо скрипку здесь показывая сериализации с JsonSerializerи разбора с JsonDocument.

DBC
источник
Спасибо @dbc. Похоже, JsonDocument.Parse будет работать для меня для JObject и JsonPropertyName для другой вещи. Завтра конвертирую мою заявку и проверим. Еще одна вещь, которую я буду искать эквивалент Formating.None Спасибо
Kamran Shahid
Большое спасибо @dbc
Камран Шахид
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
Кямран Шахид