Estamos consumiendo grandes flujos JSON desde un HTTPPublicar solicitud. El objetivo es transmitir el cuerpo entrante como JSON utilizando JsonTextReader y extraer los archivos binarios codificados en base64 incrustados en el disco. En XML, un método equivalente podría ser XMLReader.ReadElementContentAsBase64Async.
Usando JSON.NET, como iterativo, cómo enviamos cada elemento de la matriz encodedImages a un FileStream sin tener toda la cadena en la memoria.
Ejemplo de objeto JSON:
{
"company":"{clientCompany}",
"batchName":"{clientBatchName}",
"fileType":"{clientFileType}",
"encodedImages":[
"{base64encodedimage}",
"{base64encodedimage}",
"{base64encodedimage}"
],
"customFields":{
"{clientCustomField1}":"{clientCustomValue}",
"{clientCustomField2}":"{clientCustomValue}",
"{clientCustomField3}":"{clientCustomValue}",
"{clientCustomField4}":"{clientCustomValue}"
}
}
Respuestas
0 para la respuesta № 1Parece que su problema puede resolverse en dos partes: 1) Cómo analizar y procesar el JSON de manera eficiente en memoria, y 2) Cómo realizar la decodificación de base-64 de manera iterativa
1) Análisis JSON eficiente de la memoria:
Suponiendo que pueda utilizar la biblioteca Newtonsoft JSON.net, ReadAsBytes
o ReadAsBytesAsync
métodos del JsonReader
clase van a ser tus mejores amigos, ya quepermite el procesamiento iterativo basado en la transmisión, lo que le permitirá minimizar su huella de memoria durante el análisis y procesamiento de JSON. Para evitar escribir código de análisis de bajo nivel para todo su documento, puede considerar escribir un JsonConverter
implementación para el encodedImages
nodo de tu ejemplo
2) decodificación iterativa de base-64
La mayoría de las implementaciones de decodificación de base 64 decodifican una cadena en su totalidad. Soporte para decodificación iterativa en búfer (como soporte por el ReadElementContentAsBase64Async
método de XmlReader
) requiere algún estado para mantenerse. Al profundizar en la implementación de esa clase, encontrará la información interna. Base64Decoder
Clase que hace precisamente lo que necesitas.