Convertir código newtonsoft a System.Text.Json en .net core 3. ¿Qué es equivalente a JObject.Parse y JsonProperty?

12

Estoy convirtiendo mi implementación newtonsoft a una nueva biblioteca JSON en .net core 3.0. Tengo el siguiente código

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

No puedo encontrar ningún equivalente para JObject.Parse(json);

También cuál será el atributo JsonPropertyequivalente

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

Una cosa más que estaré buscando es el equivalente Formating.None.

Kamran Shahid
fuente
Lo que entendí es que para el nivel simple json es realmente sencillo. para las cosas en las que hemos usado algunos json anidados, algunos formatos de hora, valores predeterminados, creación directa de json en el diccionario, etc., debemos tener cuidado y hacer pruebas de unidad adecuadas para comparar el resultado antes y después de la conversión
Kamran Shahid

Respuestas:

15

Estás haciendo algunas preguntas aquí:

  1. No puedo encontrar ningún equivalente para JObject.Parse(json);

    Puede usar JsonDocumentpara analizar y examinar cualquier JSON, comenzando con su RootElement. El elemento raíz es de tipo JsonElementque representa cualquier valor JSON (primitivo o no) y corresponde al de Newtonsoft JToken.

    Pero tome nota de este comentario de documentación :

    Esta clase utiliza recursos de memoria agrupada para minimizar el impacto del recolector de basura (GC) en escenarios de alto uso. Si no se elimina correctamente este objeto, la memoria no se devolverá al grupo, lo que aumentará el impacto del GC en varias partes del marco.

    Cuando necesite usar un documento JsonElementfuera de la vida útil de su documento, debe clonarlo :

    Obtiene un JsonElementque se puede almacenar de forma segura más allá de la vida útil del original JsonDocument.

    También tenga en cuenta que JsonDocumentactualmente es de solo lectura y no proporciona una API para crear o modificar JSON. Hay un problema abierto Problema n. ° 39922: el Json de escritura de DOM lo rastrea.

    Un ejemplo de uso es el siguiente:

    //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. Además, ¿cuál será el atributo JsonPropertyequivalente?

    Los atributos que pueden controlar JsonSerializerse colocan en el System.Text.Json.Serializationespacio de nombres y heredan de una clase base abstractaJsonAttribute . A diferencia JsonProperty, no existe un atributo omnibus que pueda controlar todos los aspectos de la serialización de propiedades. En cambio, hay atributos específicos para controlar aspectos específicos.

    A partir de .NET Core 3, estos incluyen:

    • [JsonPropertyNameAttribute(string)]:

      Especifica el nombre de la propiedad que está presente en el JSON al serializar y deserializar. Esto anula cualquier política de nomenclatura especificada porJsonNamingPolicy .

      Este es el atributo que desea usar para controlar los nombres serializados de su ResponseJsonclase:

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

      Cuando se coloca en un tipo, el convertidor especificado se utilizará a menos que se agregue un convertidor compatible a la JsonSerializerOptions.Converterscolección o haya otro JsonConverterAttributeen una propiedad del mismo tipo.

      Tenga en cuenta que la prioridad documentada de los convertidores ( Atributo en la propiedad, luego la colección Convertidores en opciones, luego el Atributo en el tipo ) difiere del orden documentado para los convertidores Newtonsoft , que es el JsonConverter definido por el atributo en un miembro, luego el JsonConverter definido por un atributo en una clase, y finalmente cualquier convertidor pasado al JsonSerializer.

    • [JsonExtensionDataAttribute]- corresponde a la de Newtonsoft [JsonExtensionData].

    • [JsonIgnoreAttribute]- corresponde a la de Newtonsoft [JsonIgnore].

  3. Al escribir JSON vía Utf8JsonWriter, la sangría se puede controlar estableciendo JsonWriterOptions.Indenteden trueo false.

    Al serializar a JSON a través de JsonSerializer.Serialize, la sangría se puede controlar estableciendo JsonSerializerOptions.WriteIndenteden trueo false.

El violín de demostración aquí muestra la serialización JsonSerializery el análisis con JsonDocument.

dbc
fuente
Gracias @dbc. Parece que JsonDocument.Parse me funcionará para JObject y JsonPropertyName para otra cosa. Convertirá mi aplicación mañana y lo verificará. Una cosa más que voy a buscar el equivalente de formateo. Nada de gracias
Kamran Shahid
Muchas gracias @dbc
Kamran Shahid
2

Este enlace debería ayudarlo, fragmentos de los cuales copié a continuación.

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

Puede instalar la misma versión que su otro paquete

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

entonces

services.AddControllers().AddNewtonsoftJson();
tayfun Kılıç
fuente
¿Que significa esto? La pregunta es sobre la opción disponible en System.Text.json
Kamran Shahid