Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

159
Views
¿Por qué los tipos de retorno de los métodos System.Text.Json.JsonSerializer.Deserialize de .NET son anulables cuando no devuelven nulo?

Considere el método System.Text.Json.JsonSerializer.Deserialize de .NET 6 y sus muchas sobrecargas.

¿Cada uno devuelve cualquier object? o valor de TValue? lo que indica que se podría devolver un null . Sin embargo, la documentación establece que en caso de error, se lanza una excepción. Además, también establece que se devuelve un valor válido (si no se lanza una excepción). En ninguna parte dice que se puede devolver null . Y en mi experiencia de usarlo, nunca se devuelve null .

(El tipo de retorno anulable es un problema si activa la "capacidad de nulo" en su proyecto, porque el compilador luego comienza a advertirle que el valor devuelto podría ser nulo , lo que en mi experiencia (y de acuerdo con la documentación) simplemente no es cierto . Es este tipo de cosas lo que me hace apresurarme a desactivar la anulabilidad de nuevo. Sé que puedo suprimir la advertencia, pero no creo que ese sea el punto).

¿Falta la documentación? ¿Pueden los métodos realmente devolver nulo? Si no pueden, ¿por qué tenemos tipos de retorno anulables?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

De acuerdo con RFC 7159, "null" (y "true" y "false") será un texto JSON válido. Sin embargo, la cadena vacía no es un JSON válido.

over 4 years ago · Santiago Trujillo Report

0

  • TValue? Deserialize<TValue> es solo un contenedor para Object? Deserialize(type: typeof(TValue)) .
  • Cuando se agregaron anotaciones #nullable a C# 8.0, el tipo System.Type no se amplió con soporte para esas anotaciones.
    • Por lo tanto, no es posible que un tipo genérico en C# sepa (en tiempo de ejecución) si el argumento de tipo concreto de un parámetro de tipo genérico es un tipo de referencia anulable o un tipo de referencia no anulable.
      • (Esto no se aplica a Nullable<T> , por supuesto)
  • Entonces, en tiempo de ejecución, un sitio de llamada para Deserialize<TValue>() usando TValue := MyClass? o TValue := MyClass se comportará de manera idéntica porque el método Deserialize no tiene idea si MyClass tiene el ? anotación o no.
    • El Deserialize<TValue> solo sabe si TValue es un tipo de referencia o no (a través de typeof(TValue) ).
  • Por lo tanto, si le indica a JsonSerializer que deserialice la cadena "null" (que es JSON válido ) y si TValue es un tipo de referencia, devolverá null .
    • ... incluso si su TValue no tiene ? . ¡Recuerde que JsonSerializer no sabe (y no puede) saber eso!
  • ¿Cuál es la razón por la cual el tipo de retorno estático del método tiene el ? anotación, porque si no fuera así, estaría afirmando incorrectamente que nunca devuelve null .

Se puede argumentar que los diseñadores de JsonSerialize podrían haber agregado algunos métodos más que permitieran a las personas que llaman afirmar estáticamente que no son nulos, pero no lo hicieron, pero usted puede hacerlo si realmente lo desea:

Al igual que:

 public static TValue DeserializeNonNullObject<TValue>( String json ) where TValue : class { TValue? orNull = JsonSerializer.Deserialize<TValue>( json ); return orNull ?? throw new JsonException( "Expected deserialized object to be non-null, but encountered null." ); }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!