Tengo un trabajo de análisis de la corriente de Azure que produce eventos como "línea separados" y codificados en UTF8.

Creé una función Azure (v2, núcleo .NET) que se desencadena por eventos en el centro de eventos. En este contexto proceso los eventos en lotes:

public static async Task Run(
    [EventHubTrigger(
        "xxx",
        Connection = "xxx",
        ConsumerGroup = "xxx")
    ] EventData[] events, 
    ILogger log)

Mi objetivo es deserializar la entrada en un objeto basado en la clase POCO. Lo que actualmente obtengo siempre es un error de "carácter inesperado ...".

¿Cuál es la forma correcta de deserialización en ese contexto?

1
quervernetzt 14 jul. 2019 a las 18:16

1 respuesta

La mejor respuesta

Finalmente, el siguiente enfoque funcionó:

private static List<a> DeserializeInput(EventData[] events, ILogger log)
{ 
    try
    {
        List<a> inputsDeserializedAsList = new List<a>();

        foreach (EventData eventData in events)
        {
            // Deserialize Input
            string payload = Encoding.UTF8.GetString(eventData.Body);
            log.LogInformation($"DeserializeInput: payload retrieved: {payload}...");

            DateTime enqueuedTimeUtc = (DateTime)eventData.SystemProperties.EnqueuedTimeUtc;

            using (StringReader reader = new StringReader(payload))
            {
                List<a> inputEventsAsList = new List<a>();

                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    a parsedData = JsonConvert.DeserializeObject<a>(line);
                    parsedData.EventEnqueuedUtcTime = enqueuedTimeUtc;
                    inputEventsAsList.Add(parsedData);
                }
                inputsDeserializedAsList.AddRange(inputEventsAsList);
            }
        }

        return inputsDeserializedAsList;
    }
    catch (Exception e) {
        throw new Exception("DeserializeInput: failed deserializing input...", e);
    }
}
0
quervernetzt 14 jul. 2019 a las 15:16