es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema con el serializador JSON en .Net Core

Tengo una API RESTful (API web de .Net Core) que llama a otra API (de terceros) y recibe los datos en formato JSON. Luego, estos datos JSON se convierten en objetos de clase mediante deserialización.

Problema: los datos JSON devueltos por la otra API contienen algunos valores decimales como 325.34723897, sin embargo, cuando se reciben en la API RESTful, solo aparece 325 y se eliminan todos los valores decimales. La API de terceros se llama utilizando el siguiente código (responseStream ya tiene el valor truncado):

HttpWebRequest webRequest = GetWebRequest();
webRequest.Method = "POST";

UTF8Encoding encoding = new UTF8Encoding();
Byte[] byteArray = encoding.GetBytes(Request);

webRequest.ContentLength = byteArray.Length;
webRequest.Timeout = 60;

try
{
    using (Stream dataStream = webRequest.GetRequestStream())
    {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }

    WebResponse webResponse = await webRequest.GetResponseAsync();

    using (Stream responseStream = webResponse.GetResponseStream())
    {
        StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
        ResponseString = reader.ReadToEnd();
        response = _serializer.DeserializeObject<tresponse>(ResponseString);
    }
}
catch (Exception ex)
{
}

¿Cómo se puede solucionar en DotNet Core?

Encontré un foro donde se brinda una solución para el Marco de .Net, pero no para Core (ya que GlobalConfiguration no está presente en Core).

var jsonFormatter = new JsonMediaTypeFormatter();
jsonFormatter.SerializerSettings.Culture = new CultureInfo(string.Empty)
{
    NumberFormat = new NumberFormatInfo
    {
        CurrencyDecimalDigits = 5
    }
};
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema de los valores decimales truncados en los datos JSON se puede solucionar en .Net Core al configurar JsonSerializerSettings. La clase JsonSerializerSettings tiene una propiedad llamada Culture que se puede usar para especificar el formato numérico. Así es como se puede hacer:

    1. Importa el espacio de nombres Newtonsoft.Json:
    using Newtonsoft.Json;
    
    1. Configura JsonSerializerSettings:
    JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
    serializerSettings.Culture = CultureInfo.InvariantCulture;
    

    Alternativamente, puedes especificar el formato numérico directamente en el objeto JsonSerializerSettings:

    JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
    serializerSettings.Culture = new CultureInfo(string.Empty) {
        NumberFormat = new NumberFormatInfo {
            CurrencyDecimalDigits = 5
        }
    };
    
    1. Utiliza JsonSerializerSettings durante la deserialización:
    response = JsonConvert.DeserializeObject<tresponse>(ResponseString, serializerSettings);
    

    Nota: En .Net Core, Newtonsoft.Json es el serializador JSON predeterminado utilizado por el marco de trabajo de la API web.

Comments are closed.