2012-02-17 2 views
2

Je tente d'analyser un fichier JSON codé en UTF 16, mais j'ai rencontré un problème étrange.InputStreamReader, FileInputStream commence l'analyse du fichier au milieu du point au lieu de commencer

Chaque fois que j'utilise un FileInputStream, l'analyse du fichier semble commencer à mi-parcours. Par exemple, si le fichier a une longueur de 40 caractères, il commencera au caractère 20. Cela provoque des erreurs lors de l'analyse du fichier JSON, car il est évident que les données commencent au caractère 0 du fichier.

Ce problème a surgi l'autre jour, malgré des semaines de travail. Je ne vois aucun problème avec mon code car il n'a pas été modifié dans les jours qui ont précédé le début du problème.

L'une de mes solutions de contournement tentées consistait à utiliser un FileReader. Il commence normalement au caractère zéro, mais il ne peut pas gérer les caractères UTF-16 dans le document, donc ne résout pas le problème. J'utilise la bibliothèque Gson de Google pour gérer JSON, mais je pense que le problème se situe quelque part dans le InputStreamReader, ou avec FileInputStream.

Voici le code qui est en cause;

JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(file), "UTF-16")); 
reader.beginArray(); 
... 

Voici l'erreur que cela déclenche. La ligne reader.beginArray(); ci-dessus provoque l'exception.

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 21 
    at com.google.gson.stream.JsonReader.expect(JsonReader.java:337) 
    at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:304) 
    at reader.ProofDatabase.load(ProofDatabase.java:130) 
    ... 

Et voici ma solution partielle qui ne gère pas UTF16 chaînes

JsonReader reader = new JsonReader(new FileReader(file)); 
reader.beginArray(); 
... 

Toute solution, que ce soit une solution au problème d'origine, ou une autre méthode de lecture dans le fichier comme UTF16 serait plus que bienvenue.

+0

Le fichier JSON commence-t-il par un marqueur d'ordre d'octets? Comment est-il généré? – Joni

+0

Le fichier que j'utilise actuellement a été créé à la main. Comme dans j'ai tapé manuellement le json valide. Le fichier précédent a été généré en utilisant la classe 'JsonWriter' dans la bibliothèque gson. –

+0

Quel éditeur avez-vous utilisé? – Joni

Répondre

0

J'ai oublié de mettre à jour la question quand j'ai trouvé la solution.

L'erreur est venue du fait que j'ai créé manuellement le fichier JSON plutôt que de le générer par programme.

Lorsque le fichier a été généré par la classe JSONWriter, des métadonnées supplémentaires ont été ajoutées au fichier indiquant à l'analyseur qu'il s'agissait d'un fichier JSON. Cette méta-données manquait dans le fichier créé manuellement, JSONReader lançait donc des erreurs lors de l'analyse du fichier.

Questions connexes