Convertendo o código newtonsoft em System.Text.Json no .net core 3. o que é equivalente a JObject.Parse e JsonProperty

12

Estou convertendo minha implementação da newtonsoft para a nova biblioteca JSON no .net core 3.0. eu tenho o seguinte 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;
    }
}

Não consigo encontrar nenhum equivalente para JObject.Parse(json);

Também qual será o 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; }
}

Mais uma coisa que eu vou procurar o equivalente a Formating.None.

Kamran Shahid
fonte
O que eu entendi é que, para o json de nível simples, é realmente direto. para as coisas em que temos utilizar alguns json aninhada, alguns formatos de hora, os valores padrão, dicionário criação json direta etc temos que tomar cuidado e fazer testes de unidade adequada para comparar o resultado antes e depois da conversão
Kamran Shahid

Respostas:

15

Você está fazendo algumas perguntas aqui:

  1. Não consigo encontrar nenhum equivalente para JObject.Parse(json);

    Você pode usar JsonDocumentpara analisar e examinar qualquer JSON, começando pelo seu RootElement. O elemento raiz é do tipo JsonElementque representa qualquer valor JSON (primitivo ou não) e corresponde ao de Newtonsoft JToken.

    Mas tome nota desta observação da documentação :

    Essa classe utiliza recursos da memória em pool para minimizar o impacto do coletor de lixo (GC) em cenários de alto uso. A falha em descartar adequadamente esse objeto fará com que a memória não seja retornada ao pool, o que aumentará o impacto do GC em várias partes da estrutura.

    Quando você precisar usar um documento JsonElementexterno à vida útil do documento, você deve cloná- lo:

    Obtém um JsonElementque pode ser armazenado com segurança além da vida útil do original JsonDocument.

    Observe também que JsonDocumentatualmente é somente leitura e não fornece uma API para criar ou modificar JSON. Existe um problema em aberto Edição nº 39922: DOM gravável do Json rastreando isso.

    Um exemplo de uso é o seguinte:

    //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. Além disso, qual será o atributo JsonPropertyequivalente?

    Os atributos que podem controlar JsonSerializersão colocados no System.Text.Json.Serializationespaço para nome e herdam de uma classe base abstrata JsonAttribute. Diferentemente JsonProperty, não há atributo omnibus que possa controlar todos os aspectos da serialização de propriedades. Em vez disso, existem atributos específicos para controlar aspectos específicos.

    A partir do .NET Core 3, eles incluem:

    • [JsonPropertyNameAttribute(string)]:

      Especifica o nome da propriedade que está presente no JSON ao serializar e desserializar. Isso substitui qualquer política de nomenclatura especificada por JsonNamingPolicy.

      Este é o atributo que você deseja usar para controlar os nomes serializados da sua ResponseJsonclasse:

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

      Quando colocado em um tipo, o conversor especificado será usado, a menos que um conversor compatível seja adicionado à JsonSerializerOptions.Converterscoleção ou se houver outro JsonConverterAttributeem uma propriedade do mesmo tipo.

      Observe que a prioridade documentada dos conversores - Atributo na propriedade, a coleção Converters nas opções e o Atributo no tipo - difere da ordem documentada dos conversores Newtonsoft , que é o JsonConverter definido pelo atributo em um membro e o JsonConverter definido por um atributo em uma classe e, finalmente, todos os conversores passados ​​para o JsonSerializer.

    • [JsonExtensionDataAttribute]- corresponde ao de Newtonsoft [JsonExtensionData].

    • [JsonIgnoreAttribute]- corresponde ao de Newtonsoft [JsonIgnore].

  3. Ao escrever JSON via Utf8JsonWriter, o recuo pode ser controlado pela configuração JsonWriterOptions.Indentedde trueou false.

    Ao serializar para JSON via JsonSerializer.Serialize, o recuo pode ser controlado pela configuração JsonSerializerOptions.WriteIndentedde trueou false.

Violino de demonstração aqui mostrando serialização JsonSerializere análise com JsonDocument.

dbc
fonte
Obrigado @dbc. Parece que JsonDocument.Parse funcionará para mim para JObject e JsonPropertyName para outra coisa. Irá converter meu aplicativo amanhã e verificará. Só mais uma coisa eu vou estar olhando para o equivalente de Formating.None Graças
Kamran Shahid
Graças a @dbc muito
Kamran Shahid
2

Este link deve ajudá-lo, trechos dos quais copiei abaixo.

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

Você pode mesma versão que seu outro pacote de instalação

  Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson 

então

services.AddControllers().AddNewtonsoftJson();
tayfun Kılıç
fonte
O que isso significa? A pergunta é sobre a opção disponível no System.Text.json
Kamran Shahid