2017-10-10 6 views
0

Nous consommons de grands flux JSON à partir d'une requête HTTP Post. Le but est de diffuser le corps entrant en JSON en utilisant JsonTextReader et d'extraire les fichiers binaires codés en base64 incorporés sur le disque. En XML, une méthode équivalente peut être XMLReader.ReadElementContentAsBase64Async.Transmettre la chaîne codée Base64 en utilisant la valeur JsonTextReader comme nouveau flux

En utilisant JSON.NET, comme nous itératif comment nous envoyons chaque élément du tableau encodedImages dans un FileStream sans contenir toute la chaîne en mémoire.

Exemple JSON Objet:

{ 
    "company":"{clientCompany}", 
    "batchName":"{clientBatchName}", 
    "fileType":"{clientFileType}", 
    "encodedImages":[ 
     "{base64encodedimage}", 
     "{base64encodedimage}", 
     "{base64encodedimage}" 
    ], 
    "customFields":{ 
     "{clientCustomField1}":"{clientCustomValue}", 
     "{clientCustomField2}":"{clientCustomValue}", 
     "{clientCustomField3}":"{clientCustomValue}", 
     "{clientCustomField4}":"{clientCustomValue}" 
    } 
} 
+0

Je ne pense pas. [cette question] (https://stackoverflow.com/q/46365304/3744182) n'a jamais été résolue, ce qui semble avoir conduit à l'édition # 1462 [Ajouter la lecture mise en mémoire tampon des données binaires à JsonTextReader # 1462] (https: // github .com/JamesNK/Newtonsoft.Json/issues/1462). – dbc

+0

@dbc Il semble que ce problème a été soulevé il y a 1 heure et la question a été posée il y a environ 3 semaines. Peut-être que nos discussions combinées augmenteront la notoriété :-) –

+0

Vous pouvez toujours ajouter un commentaire au numéro 1462 indiquant que vous aimeriez aussi cette capacité. – dbc

Répondre

0

Il semble que votre problème peut être résolu en deux parties: 1) Comment analyser et de traiter le JSON d'une manière efficace de la mémoire, et 2) Comment effectuer base- 64 décodage itérativement

1) mémoire parsing JSON efficace:

en supposant que vous pouvez utiliser la bibliothèque Newtonsoft JSON.net, les ReadAsBytes ou ReadAsBytesAsync méthodes de la classe JsonReader vont être votre meilleur fr iends, car ils permettent un traitement itératif basé sur les flux qui vous permettra de minimiser votre empreinte mémoire lors de l'analyse et du traitement JSON. Pour éviter d'écrire du code d'analyse de bas niveau pour l'ensemble de votre document, vous pouvez envisager d'écrire une implémentation JsonConverter pour le nœud encodedImages de votre exemple.

2) base 64 décodage itératif

La plupart des implémentations de base 64 de décodage décode une chaîne de caractères dans son intégralité. La prise en charge du décodage tamponné itératif (en tant que support par la méthode ReadElementContentAsBase64Async de XmlReader) nécessite la maintenance d'un état. Creuser dans la mise en œuvre de cette classe, vous trouverez la classe interne Base64Decoder qui fait exactement ce dont vous avez besoin.