Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1562 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Android] Parser un fichier JSON

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Android] Parser un fichier JSON

n°2170032
Thomas3128
Posté le 06-01-2013 à 17:45:36  profilanswer
 

Bonjour,
 
Je doit parser un fichier JSON, je n'ai pas de soucis avec un fichier de type :
 

Code :
  1. {
  2.     "Users": [
  3.         {
  4.             "firstname": "",
  5.             "lastname": "",
  6.             "login": "",
  7.             "twitter": "",
  8.             "mail": "",
  9.     "telephone" :
  10.  {
  11.   "fixe": "",
  12.   "mobile": ""
  13.  }
  14.         },
  15.         {
  16.             "firstname": "",
  17.             "lastname": "",
  18.             "login": "",
  19.             "twitter": "",
  20.             "mail": "",
  21.             "telephone" :
  22.  {
  23.   "fixe": "",
  24.   "mobile": ""
  25.  }
  26.         }
  27.     ]
  28. }


 
J'utilise le code suivant :
 
UsersController

Code :
  1. package com.example.parsingtest;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.net.HttpURLConnection;
  8. import java.net.MalformedURLException;
  9. import java.net.URL;
  10. import java.util.ArrayList;
  11. import org.codehaus.jackson.JsonFactory;
  12. import org.codehaus.jackson.JsonParseException;
  13. import org.codehaus.jackson.JsonParser;
  14. import org.codehaus.jackson.map.ObjectMapper;
  15. import android.os.Environment;
  16. public class UsersController {
  17.     private static final String DL_URL = "http://XXX/users.json";
  18.     private ObjectMapper objectMapper = null;
  19.     private JsonFactory jsonFactory = null;
  20.     private JsonParser jp = null;
  21.     private ArrayList<User> userList = null;
  22.     private Users users = null;
  23.     private File jsonOutputFile;
  24.     private File jsonFile;
  25.     public UsersController() {
  26.     objectMapper = new ObjectMapper();
  27.     jsonFactory = new JsonFactory();
  28.     }
  29.     public void init() {
  30.     downloadJsonFile();
  31.     try{
  32.         jp = jsonFactory.createJsonParser(jsonFile);
  33.         users = objectMapper.readValue(jp, Users.class);
  34.         userList = users.get("users" );
  35.     } catch(JsonParseException e) {
  36.         e.printStackTrace();
  37.     } catch(IOException e) {
  38.         e.printStackTrace();
  39.     }
  40.     }
  41.     private void downloadJsonFile() {
  42.     try{
  43.         createFileAndDirectory();
  44.         URL url = new URL(UsersController.DL_URL);
  45.         HttpURLConnection urlConnection;
  46.         urlConnection = (HttpURLConnection) url.openConnection();
  47.         urlConnection.setRequestMethod("GET" );
  48.         urlConnection.setDoOutput(true);
  49.         urlConnection.connect();
  50.         FileOutputStream fileOutput = new FileOutputStream(jsonFile);
  51.         InputStream inputStream = urlConnection.getInputStream();
  52.         byte[] buffer = new byte[1024];
  53.         int bufferLength = 0;
  54.         while((bufferLength = inputStream.read(buffer)) > 0) {
  55.         fileOutput.write(buffer, 0, bufferLength);
  56.         }
  57.         fileOutput.close();
  58.     } catch(MalformedURLException e) {
  59.         e.printStackTrace();
  60.     } catch(IOException e) {
  61.         e.printStackTrace();
  62.     }
  63.     }
  64.     private void createFileAndDirectory() throws FileNotFoundException {
  65.     final String extStorageDirectory = Environment
  66.         .getExternalStorageDirectory().toString();
  67.     final String meteoDirectory_path = extStorageDirectory + "/tutos-android";
  68.     jsonOutputFile = new File(meteoDirectory_path, "/" );
  69.     if(jsonOutputFile.exists() == false)
  70.         jsonOutputFile.mkdirs();
  71.     jsonFile = new File(jsonOutputFile, "users.json" );
  72.     }
  73.     public ArrayList<User> findAll() {
  74.      return userList;
  75.     }
  76.     public User findById(int id) {
  77.      return userList.get(id);
  78.     }
  79. }


 
User

Code :
  1. package com.example.parsingtest;
  2. public class User {
  3.     private String firstname;
  4.     private String lastname;
  5.     private String login;
  6.     private String twitter;
  7.     private String mail;
  8.     private Telephone telephone;
  9.     public User() {
  10.     super();
  11.     this.firstname = "";
  12.     this.lastname = "";
  13.     this.login = "";
  14.     this.twitter = "";
  15.     this.mail = "";
  16.     this.telephone = null;
  17.     }
  18.     public User(String firstName, String lastName, String login,
  19.                 String twitter, String web) {
  20.     super();
  21.     this.firstname = firstName;
  22.     this.lastname = lastName;
  23.     this.login = login;
  24.     this.twitter = twitter;
  25.     this.mail = web;
  26.     }
  27.     public String getFirstname() {
  28.         return firstname;
  29.     }
  30.     public void setFirstname(String firstName) {
  31.         this.firstname = firstName;
  32.     }
  33.     public String getLastname() {
  34.         return lastname;
  35.     }
  36.     public void setLastname(String lastName) {
  37.         this.lastname = lastName;
  38.     }
  39.     public String getLogin() {
  40.         return login;
  41.     }
  42.     public void setLogin(String login) {
  43.         this.login = login;
  44.     }
  45.     public String getTwitter() {
  46.         return twitter;
  47.     }
  48.     public void setTwitter(String twitter) {
  49.         this.twitter = twitter;
  50.     }
  51.     public String getMail() {
  52.         return mail;
  53.     }
  54.     public void setMail(String mail) {
  55.         this.mail = mail;
  56.     }
  57. public Telephone getTelephone() {
  58.  return telephone;
  59. }
  60. public void setTelephone(Telephone telephone) {
  61.  this.telephone = telephone;
  62. }
  63. }


 
Users

Code :
  1. package com.example.parsingtest;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. public class Users extends HashMap<String, ArrayList<User>> {
  5.     private static final long serialVersionUID = 1L;
  6. }


 
Telephone

Code :
  1. package com.example.parsingtest;
  2. import org.json.JSONObject;
  3. public class Telephone extends JSONObject {
  4. private String fixe;
  5. private String mobile;
  6. public String getFixe() {
  7.  return fixe;
  8. }
  9. public void setFixe(String fixe) {
  10.  this.fixe = fixe;
  11. }
  12. public String getMobile() {
  13.  return mobile;
  14. }
  15. public void setMobile(String mobile) {
  16.  this.mobile = mobile;
  17. }
  18. }


 
MainActivity

Code :
  1. package com.example.parsingtest;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.view.View;
  5. import android.view.View.OnClickListener;
  6. import android.widget.Button;
  7. import android.widget.TextView;
  8. public class MainActivity extends Activity {
  9. private UsersController usersController;
  10.     private TextView displayJson;
  11.     @Override
  12.     public void onCreate(Bundle savedInstanceState) {
  13.    
  14.  super.onCreate(savedInstanceState);
  15.  setContentView(R.layout.activity_main);
  16.  usersController = new UsersController();
  17.  displayJson = (TextView) findViewById(R.id.jsonDisplay);
  18.  Button startParsing = (Button) findViewById(R.id.startParsing);
  19.  startParsing.setOnClickListener(new OnClickListener() {
  20.      @Override
  21.      public void onClick(View view) {
  22.   gettingJson();
  23.      }
  24.  });
  25.     }
  26.     final void gettingJson() {
  27.    
  28.  final Thread checkUpdate = new Thread() {
  29.      public void run() {
  30.   usersController.init();
  31.   final StringBuilder str = new StringBuilder("user :\n " );
  32.   for (User u : usersController.findAll()) {
  33.       str.append("\n" ).append("first name : " ).append(u.getFirstname());
  34.       str.append("\n" ).append("last name : " ).append(u.getLastname());
  35.       str.append("\n" ).append("login : " ).append(u.getLogin());
  36.       str.append("\n" ).append("twitter : " ).append(u.getTwitter());
  37.       str.append("\n" ).append("Mail : " ).append(u.getMail());
  38.       str.append("\n" ).append("Mobile : " ).append(u.getTelephone().getMobile());
  39.       str.append("\n" ).append("Fixe : " ).append(u.getTelephone().getFixe());
  40.       str.append("\n" );
  41.   }
  42.   runOnUiThread(new Runnable() {
  43.           @Override
  44.           public void run() {
  45.               displayJson.setText(str.toString());
  46.           }
  47.       });
  48.      }
  49.  };
  50.  checkUpdate.start();
  51.     }
  52. }


 
Mais j'ai un gros problème avec un fichier de type :
 

Code :
  1. {
  2. "attribut": "",
  3. "objetUsers" :
  4. {
  5.     "Users": [
  6.         {
  7.             "firstname": "",
  8.             "lastname": "",
  9.             "login": "",
  10.             "twitter": "",
  11.             "mail": "",
  12.     "telephone" :
  13.  {
  14.   "fixe": "",
  15.   "mobile": ""
  16.  }
  17.         },
  18.         {
  19.             "firstname": "",
  20.             "lastname": "",
  21.             "login": "",
  22.             "twitter": "",
  23.             "mail": "",
  24.             "telephone" :
  25.  {
  26.   "fixe": "",
  27.   "mobile": ""
  28.  }
  29.         }
  30.     ]
  31. }
  32. }


 
Ces lignes en plus...

Code :
  1. {
  2. "attribut": "",
  3. "objetUsers" :
  4. {


 
J'ai tenter de modifier avec le code suivant...
 
ObjetUsers

Code :
  1. package com.example.parsingtest;
  2. import org.json.JSONObject;
  3. public class ObjetUsers extends JSONObject  {
  4. private Users users;
  5. public Users getUsers() {
  6.  return users;
  7. }
  8. public void setUsers(Users objetUsers) {
  9.  this.users = objetUsers;
  10. }
  11. }


 
Users

Code :
  1. package com.example.parsingtest;
  2. import java.util.ArrayList;
  3. public class Users {
  4. private ArrayList<User> listUser;
  5. public ArrayList<User> getListUser() {
  6.  return listUser;
  7. }
  8. public void setListUser(ArrayList<User> listUser) {
  9.  this.listUser = listUser;
  10. }
  11. }


 
User

Code :
  1. package com.example.parsingtest;
  2. public class User {
  3.     private String firstname;
  4.     private String lastname;
  5.     private String login;
  6.     private String twitter;
  7.     private String mail;
  8.     private Telephone telephone;
  9.     public User() {
  10.     super();
  11.     this.firstname = "";
  12.     this.lastname = "";
  13.     this.login = "";
  14.     this.twitter = "";
  15.     this.mail = "";
  16.     this.telephone = null;
  17.     }
  18.     public User(String firstName, String lastName, String login,
  19.                 String twitter, String web) {
  20.     super();
  21.     this.firstname = firstName;
  22.     this.lastname = lastName;
  23.     this.login = login;
  24.     this.twitter = twitter;
  25.     this.mail = web;
  26.     }
  27.     public String getFirstname() {
  28.         return firstname;
  29.     }
  30.     public void setFirstname(String firstName) {
  31.         this.firstname = firstName;
  32.     }
  33.     public String getLastname() {
  34.         return lastname;
  35.     }
  36.     public void setLastname(String lastName) {
  37.         this.lastname = lastName;
  38.     }
  39.     public String getLogin() {
  40.         return login;
  41.     }
  42.     public void setLogin(String login) {
  43.         this.login = login;
  44.     }
  45.     public String getTwitter() {
  46.         return twitter;
  47.     }
  48.     public void setTwitter(String twitter) {
  49.         this.twitter = twitter;
  50.     }
  51.     public String getMail() {
  52.         return mail;
  53.     }
  54.     public void setMail(String mail) {
  55.         this.mail = mail;
  56.     }
  57. public Telephone getTelephone() {
  58.  return telephone;
  59. }
  60. public void setTelephone(Telephone telephone) {
  61.  this.telephone = telephone;
  62. }
  63. }


 
Telephone

Code :
  1. package com.example.parsingtest;
  2. import org.json.JSONObject;
  3. public class Telephone extends JSONObject {
  4. private String fixe;
  5. private String mobile;
  6. public String getFixe() {
  7.  return fixe;
  8. }
  9. public void setFixe(String fixe) {
  10.  this.fixe = fixe;
  11. }
  12. public String getMobile() {
  13.  return mobile;
  14. }
  15. public void setMobile(String mobile) {
  16.  this.mobile = mobile;
  17. }
  18. }


 
UsersController

Code :
  1. package com.example.parsingtest;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.net.HttpURLConnection;
  8. import java.net.MalformedURLException;
  9. import java.net.URL;
  10. import java.util.ArrayList;
  11. import org.codehaus.jackson.JsonFactory;
  12. import org.codehaus.jackson.JsonParseException;
  13. import org.codehaus.jackson.JsonParser;
  14. import org.codehaus.jackson.map.ObjectMapper;
  15. import android.os.Environment;
  16. public class UsersController {
  17.     private static final String DL_URL = "http://s414547850.onlinehome.fr/users.json";
  18.     private ObjectMapper objectMapper = null;
  19.     private JsonFactory jsonFactory = null;
  20.     private JsonParser jp = null;
  21.     private ArrayList<User> userList = null;
  22.     private Parse parse = null;
  23.     private File jsonOutputFile;
  24.     private File jsonFile;
  25.     public UsersController() {
  26.     objectMapper = new ObjectMapper();
  27.     jsonFactory = new JsonFactory();
  28.     }
  29.     public void init() {
  30.     downloadJsonFile();
  31.     try{
  32.         jp = jsonFactory.createJsonParser(jsonFile);
  33.         parse = objectMapper.readValue(jp, Parse.class);
  34.         userList = parse.getObjetUsers().getUsers().getListUser();
  35.     } catch(JsonParseException e) {
  36.         e.printStackTrace();
  37.     } catch(IOException e) {
  38.         e.printStackTrace();
  39.     }
  40.     }
  41.     private void downloadJsonFile() {
  42.     try{
  43.         createFileAndDirectory();
  44.         URL url = new URL(UsersController.DL_URL);
  45.         HttpURLConnection urlConnection;
  46.         urlConnection = (HttpURLConnection) url.openConnection();
  47.         urlConnection.setRequestMethod("GET" );
  48.         urlConnection.setDoOutput(true);
  49.         urlConnection.connect();
  50.         FileOutputStream fileOutput = new FileOutputStream(jsonFile);
  51.         InputStream inputStream = urlConnection.getInputStream();
  52.         byte[] buffer = new byte[1024];
  53.         int bufferLength = 0;
  54.         while((bufferLength = inputStream.read(buffer)) > 0) {
  55.         fileOutput.write(buffer, 0, bufferLength);
  56.         }
  57.         fileOutput.close();
  58.     } catch(MalformedURLException e) {
  59.         e.printStackTrace();
  60.     } catch(IOException e) {
  61.         e.printStackTrace();
  62.     }
  63.     }
  64.     private void createFileAndDirectory() throws FileNotFoundException {
  65.     final String extStorageDirectory = Environment
  66.         .getExternalStorageDirectory().toString();
  67.     final String meteoDirectory_path = extStorageDirectory + "/tutos-android";
  68.     jsonOutputFile = new File(meteoDirectory_path, "/" );
  69.     if(jsonOutputFile.exists() == false)
  70.         jsonOutputFile.mkdirs();
  71.     jsonFile = new File(jsonOutputFile, "users.json" );
  72.     }
  73.     public ArrayList<User> findAll() {
  74.      return userList;
  75.     }
  76.     public User findById(int id) {
  77.      return userList.get(id);
  78.     }
  79. }


 
Parse

Code :
  1. package com.example.parsingtest;
  2. public class Parse {
  3. private String attribut;
  4. private ObjetUsers objetUsers;
  5. public String getAttribut() {
  6.  return attribut;
  7. }
  8. public void setAttribut(String attribut) {
  9.  this.attribut = attribut;
  10. }
  11. public ObjetUsers getObjetUsers() {
  12.  return objetUsers;
  13. }
  14. public void setObjetUsers(ObjetUsers objetUsers) {
  15.  this.objetUsers = objetUsers;
  16. }
  17. }


 
... Mais cela ne fonctionne pas. Voici le logcat :
 

Code :
  1. 01-05 21:51:51.649: D/dalvikvm(327): GC freed 5586 objects / 356272 bytes in 59ms
  2. 01-05 21:51:51.829: D/dalvikvm(327): GC freed 13527 objects / 590536 bytes in 54ms
  3. 01-05 21:51:52.049: D/dalvikvm(327): GC freed 12646 objects / 504056 bytes in 55ms
  4. 01-05 21:51:52.079: W/System.err(327): org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "Users" (Class com.example.parsingtest.ObjetUsers), not marked as ignorable
  5. 01-05 21:51:52.079: W/System.err(327):  at [Source: /sdcard/tutos-android/users.json; line: 5, column: 15] (through reference chain: com.example.parsingtest.Parse["objetUsers"]->com.example.parsingtest.ObjetUsers["Users"])
  6. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:246)
  7. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.StdDeserializer.reportUnknownProperty(StdDeserializer.java:604)
  8. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.StdDeserializer.handleUnknownProperty(StdDeserializer.java:590)
  9. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:689)
  10. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:514)
  11. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
  12. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
  13. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:356)
  14. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
  15. 01-05 21:51:52.079: W/System.err(327):  at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
  16. 01-05 21:51:52.090: W/System.err(327):  at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2376)
  17. 01-05 21:51:52.090: W/System.err(327):  at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1087)
  18. 01-05 21:51:52.090: W/System.err(327):  at com.example.parsingtest.UsersController.init(UsersController.java:41)
  19. 01-05 21:51:52.090: W/System.err(327):  at com.example.parsingtest.MainActivity$2.run(MainActivity.java:37)
  20. 01-05 21:51:52.090: W/dalvikvm(327): threadid=15: thread exiting with uncaught exception (group=0x4001b188)
  21. 01-05 21:51:52.090: E/AndroidRuntime(327): Uncaught handler: thread Thread-8 exiting due to uncaught exception
  22. 01-05 21:51:52.090: E/AndroidRuntime(327): java.lang.NullPointerException
  23. 01-05 21:51:52.090: E/AndroidRuntime(327):  at com.example.parsingtest.MainActivity$2.run(MainActivity.java:39)
  24. 01-05 21:51:52.109: I/dalvikvm(327): threadid=7: reacting to signal 3
  25. 01-05 21:51:52.109: E/dalvikvm(327): Unable to open stack trace file '/data/anr/traces.txt': Permission denied


 
Le problème et que je sais même pas si je m'y prend bien au niveau de la structure du fichier Json, et du coup de mes classes. Est-ce que le problème viens de la structure de mes classes ou des quelques lignes suivantes ?
 

Code :
  1. public void init() {
  2.     downloadJsonFile();
  3.     try{
  4.         jp = jsonFactory.createJsonParser(jsonFile);
  5.         parse = objectMapper.readValue(jp, Parse.class);
  6.         userList = parse.getObjetUsers().getUsers().getListUser();
  7.     } catch(JsonParseException e) {
  8.         e.printStackTrace();
  9.     } catch(IOException e) {
  10.         e.printStackTrace();
  11.     }
  12.     }


 
Merci d'avance...

mood
Publicité
Posté le 06-01-2013 à 17:45:36  profilanswer
 

n°2170322
czh
Posté le 09-01-2013 à 00:07:21  profilanswer
 

Thomas3128 a écrit :


Mais j'ai un gros problème avec un fichier de type :
 

Code :
  1. {
  2. "attribut": "",
  3. "objetUsers" :
  4. {
  5.     "Users": [
  6.         {
  7.             "firstname": "",
  8.             "lastname": "",
  9.             "login": "",
  10.             "twitter": "",
  11.             "mail": "",
  12.     "telephone" :
  13.  {
  14.   "fixe": "",
  15.   "mobile": ""
  16.  }
  17.         },
  18.         {
  19.             "firstname": "",
  20.             "lastname": "",
  21.             "login": "",
  22.             "twitter": "",
  23.             "mail": "",
  24.             "telephone" :
  25.  {
  26.   "fixe": "",
  27.   "mobile": ""
  28.  }
  29.         }
  30.     ]
  31. }
  32. }




 
En mettant "Users" en minuscule, ça donne quoi ?


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Android] Parser un fichier JSON

 

Sujets relatifs
JAVA(traduction d'un fichier texte en morse)Récupérer des variables d'un fichier INI
comment lire un fichier(.txt) avec scilabRéférence à une cellule dans un fichier externe
fichier JNLP et java 5Modifier format fichier xml
Modification fichier hostlire un fichier
Formater un fichier xml en pythonlecture dans un fichier à accès random
Plus de sujets relatifs à : [Android] Parser un fichier JSON


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR