IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Parser proprement un JSON


Sujet :

Android

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut Parser proprement un JSON
    C'est plus une question qu'un besoin d'aide.
    Pour remplir mes listes, j'ai fais des json, et maintenant que j'essaie de tout traduire en francais, je me retrouve confronté au problème des accents. Je voulais savoir s'il était vraiment possible de parser de json en francais sans devoir transformé à chaque fois les é et autres lettres caractéristiques par leur unicode respectifs.

    Mes méthodes de parsing sont soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	    InputStream is = context.getResources().openRawResource(
    		    R.raw.constant);
    	    int size = is.available();
    	    byte[] buffer = new byte[size];
    	    is.read(buffer);
    	    is.close();
    	    data = new String(buffer, "UTF-8");
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    InputStream inputStream = context.getResources().openRawResource(
    		    R.raw.organic_function);
    	    BufferedReader reader = new BufferedReader(new InputStreamReader(
    		    inputStream, "UTF-8"), 8);
    	    StringBuilder sb = new StringBuilder();
    	    String line = null;
    	    while ((line = reader.readLine()) != null) {
    		sb.append(line + "\n");
    	    }
    	    data = sb.toString();
    	    inputStream.close();
    C'est bien sur dans des try-catch

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    JSON est un format de texte... par conséquent le serveur doit remplir le header "Character-Encoding" HTTP, et celui-ci doit être pris en compte par le client, et dans ce cas plus de problème d'accent.
    Ou sinon, considérer que le flux est toujours de l'UTF-8.
    Dans les cas des ressources, ben non, c'est toujours de l'UTF-8


    Par contre pour parser du texte je ne vois pas trop la différence entre les deux méthodes (la première étant probablement plus rapide).

    Il doit être possible de créer un JSONTokener à base de InputStream par contre, rendant la copie du JSON dans une string, puis la transformation en JSONObject plus "simple" (et moins gourmande en mémoire).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Ok, donc si j'ai bien compris, dès que j'aurais envie d'internationalisé mes applis, je vais galérer avec mes xml et json ou je devrais changer tous les accents en leur unicode correspondant

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Turvy Voir le message
    Ok, donc si j'ai bien compris, dès que j'aurais envie d'internationalisé mes applis, je vais galérer avec mes xml et json ou je devrais changer tous les accents en leur unicode correspondant
    Non à partir du moment où tu précises bien le bon encodage il n'y a pas de soucis.
    Quel est le problème que tu rencontres exactement ?



    Sinon j'aurais quelques remarques sur tes deux codes :
    • La libération des ressources doit être faite via un try-with-ressource (Java 7) ou un try/finally par ressource (Java 6 et -).
      Ceci afin d'éviter qu'un bug anodin n'entraine un blocage des ressources...
    • Tu ne peux pas te baser sur available() comme tu le fais dans ton premier code.
      available() ne renvoi pas toujours la taille du fichier, mais uniquement le nombre d'octet disponible immédiatement sans blocage.
      Tu pourrais donc te retrouver avec un fichier tronqué...
    • BufferedReader/readLine() est un peu inutile. Pourquoi découper le fichier en ligne si c'est pour reconstruire un texte complet ?



    Perso je passerais par un Reader avec un buffer manuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    	Charset charset = Charset.forName("UTF-8");
    	InputStream is = context.getResources().openRawResource(R.raw.constant);
    	try {
    		Reader reader = new InputStreamReader(is, charset);
    		try {
    			StringBuilder sb = new StringBuilder();
    			char[] cbuf = new char[8192];
    			int len;
     
    			while ( (len=reader.read(cbuf)) > 0 ) {
    				sb.append(cbuf, 0, len);
    			}
    			data = sb.toString();
    		} finally {
    			reader.close();
    		}
    	} finally {
    		is.close();
    	}

    A noter que l'on peut remplacer le Charset par un CharsetDecoder dans le constructeur d'InputStreamReader.
    Cela permet de controller les cas d'erreur à la lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	Charset charset = Charset.forName("UTF-8");
    	CharsetDecoder decoder = charset.newDecoder();
    	decoder.onMalformedInput(CodingErrorAction.REPORT);
    	decoder.onUnmappableCharacter(CodingErrorAction.REPORT);

    a++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Quel est le problème que tu rencontres exactement ?

    C'est simple, pour l'internationalisation, quand j'écris mes json en francais avec les accents ou autres, ca affiche toujours un ? dans un losange noir à la place, que ca soit sur mon téléphone, ou sur l'émulateur de Genymotion.

    J'ai testé avec ton code mais ca ne change rien. La seule solution valable, relativement fastidieuse, reste la modification des lettres accentuées par leur unicode. C'est surtout galère pour la correction ou mise à jour des json.

    Le problème vient vraiment du parser car déjà, le String data = sb.toString(); contient les mauvais caractères.

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Dans ce cas cela signifie sûrement que ton JSON n'est pas en UTF-8.
    Comment le génères-tu ?

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    C'est certainement ca le problème, j'ai fouillé partout sur le net et je ne vois pas la source de l'erreur. Apparemment, pour les json, il n'y a pas d'indicateur comme pour les xml (<?xml version="1.0" encoding="utf-8"?>)

    Pour faire mes json, je fais simplement New --> File que je nomme mon_ fichier.json, et je le remplis. Je les vérifie toujours grâce à un json validator sur le net.

  8. #8
    Membre éclairé
    Avatar de LeBzul
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 381
    Points : 832
    Points
    832
    Par défaut
    Salut,
    Je pense qu'il faut que tu vérifies ton éditeur de texte / IDE, pour qu'il écrive avec le bon encodage dans ton json.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Je viens de vérifier et régler l'encodage, et maintenant ca marche. Faut quand même que je réécrive les commentaires et autres qui ont été modifiés par le réencodage, mais au moins, je n'aurais plus à me prendre la tête avec ca.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Ecrire proprement un json en php
    Par Leduc08 dans le forum AJAX
    Réponses: 5
    Dernier message: 08/11/2012, 15h12
  2. Parser/ traiter du JSON
    Par Ub1quity dans le forum C#
    Réponses: 15
    Dernier message: 21/03/2012, 23h25
  3. Parser LDAP vers Json ?
    Par guilopouloos dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 28/07/2011, 09h52
  4. Parser un flux JSON
    Par Cool_Boy dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/06/2011, 11h15
  5. Parser un fichier JSON en Java
    Par zinga dans le forum Android
    Réponses: 5
    Dernier message: 09/02/2011, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo