Преобразование кода newtonsoft в System.Text.Json в ядре .net 3. Что эквивалентно JObject.Parse и JsonProperty - PullRequest
2 голосов
/ 07 октября 2019

Я конвертирую свою реализацию 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.

Ответы [ 2 ]

3 голосов
/ 07 октября 2019

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

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

    Вы можете использоватьJsonDocument до анализ любой JSON. Но обратите внимание на эту документацию замечание :

    Этот класс использует ресурсы из объединенной памяти, чтобы минимизировать влияние сборщика мусора (GC) в сценариях с высокой нагрузкой. Неправильная утилизация этого объекта приведет к тому, что память не будет возвращена в пул, что увеличит влияние GC на различные части платформы.

    Пример использования следующий:

    //https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#using-declarations 
    using var doc = JsonDocument.Parse(json);
    
    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
    
    using var ms = new MemoryStream();
    using (var writer = new Utf8JsonWriter(ms, new JsonWriterOptions { Indented = true }))
    {
        doc.WriteTo(writer);
    }
    var json2 = Encoding.UTF8.GetString(ms.ToArray());
    
    Console.WriteLine(json2);
    
  2. Также, что будет атрибутом JsonProperty эквивалентом?

    Атрибуты, которые могут контролировать JsonSerializer, размещеныв пространстве имен System.Text.Json.Serialization. В отличие от 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)]:

      При размещении на типе указанный преобразователь будет использоваться, если к * не добавлен совместимый преобразователь. 1070 * коллекция или есть другое JsonConverterAttribute для свойства того же типа.

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

    • [JsonExtensionDataAttribute] - соответствует Newtonsoft's [JsonExtensionData].

    • [JsonIgnoreAttribute]- соответствует [JsonIgnore].

    * 110 от Newtonsoft2 *
  3. При записи JSON с помощью Utf8JsonWriter можно управлять отступом, задав для JsonWriterOptions.Indented значение true или false.

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

Демонстрационная скрипка здесь , показывающая сериализацию с JsonSerializer и анализ с JsonDocument.

1 голос
/ 07 октября 2019

Эта ссылка должна помочь вам, фрагменты которой я скопировал ниже.

https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/

</p>

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

...