Thomas3128 | Bonjour,
Je doit parser un fichier JSON, je n'ai pas de soucis avec un fichier de type :
Code :
- {
- "Users": [
- {
- "firstname": "",
- "lastname": "",
- "login": "",
- "twitter": "",
- "mail": "",
- "telephone" :
- {
- "fixe": "",
- "mobile": ""
- }
- },
- {
- "firstname": "",
- "lastname": "",
- "login": "",
- "twitter": "",
- "mail": "",
- "telephone" :
- {
- "fixe": "",
- "mobile": ""
- }
- }
- ]
- }
|
J'utilise le code suivant :
UsersController
Code :
- package com.example.parsingtest;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.util.ArrayList;
- import org.codehaus.jackson.JsonFactory;
- import org.codehaus.jackson.JsonParseException;
- import org.codehaus.jackson.JsonParser;
- import org.codehaus.jackson.map.ObjectMapper;
- import android.os.Environment;
- public class UsersController {
- private static final String DL_URL = "http://XXX/users.json";
- private ObjectMapper objectMapper = null;
- private JsonFactory jsonFactory = null;
- private JsonParser jp = null;
- private ArrayList<User> userList = null;
- private Users users = null;
- private File jsonOutputFile;
- private File jsonFile;
- public UsersController() {
- objectMapper = new ObjectMapper();
- jsonFactory = new JsonFactory();
- }
- public void init() {
- downloadJsonFile();
- try{
- jp = jsonFactory.createJsonParser(jsonFile);
- users = objectMapper.readValue(jp, Users.class);
- userList = users.get("users" );
- } catch(JsonParseException e) {
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- private void downloadJsonFile() {
- try{
- createFileAndDirectory();
- URL url = new URL(UsersController.DL_URL);
- HttpURLConnection urlConnection;
- urlConnection = (HttpURLConnection) url.openConnection();
- urlConnection.setRequestMethod("GET" );
- urlConnection.setDoOutput(true);
- urlConnection.connect();
- FileOutputStream fileOutput = new FileOutputStream(jsonFile);
- InputStream inputStream = urlConnection.getInputStream();
- byte[] buffer = new byte[1024];
- int bufferLength = 0;
- while((bufferLength = inputStream.read(buffer)) > 0) {
- fileOutput.write(buffer, 0, bufferLength);
- }
- fileOutput.close();
- } catch(MalformedURLException e) {
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- private void createFileAndDirectory() throws FileNotFoundException {
- final String extStorageDirectory = Environment
- .getExternalStorageDirectory().toString();
- final String meteoDirectory_path = extStorageDirectory + "/tutos-android";
- jsonOutputFile = new File(meteoDirectory_path, "/" );
- if(jsonOutputFile.exists() == false)
- jsonOutputFile.mkdirs();
- jsonFile = new File(jsonOutputFile, "users.json" );
- }
- public ArrayList<User> findAll() {
- return userList;
- }
- public User findById(int id) {
- return userList.get(id);
- }
- }
|
User
Code :
- package com.example.parsingtest;
- public class User {
- private String firstname;
- private String lastname;
- private String login;
- private String twitter;
- private String mail;
- private Telephone telephone;
- public User() {
- super();
- this.firstname = "";
- this.lastname = "";
- this.login = "";
- this.twitter = "";
- this.mail = "";
- this.telephone = null;
- }
- public User(String firstName, String lastName, String login,
- String twitter, String web) {
- super();
- this.firstname = firstName;
- this.lastname = lastName;
- this.login = login;
- this.twitter = twitter;
- this.mail = web;
- }
- public String getFirstname() {
- return firstname;
- }
- public void setFirstname(String firstName) {
- this.firstname = firstName;
- }
- public String getLastname() {
- return lastname;
- }
- public void setLastname(String lastName) {
- this.lastname = lastName;
- }
- public String getLogin() {
- return login;
- }
- public void setLogin(String login) {
- this.login = login;
- }
- public String getTwitter() {
- return twitter;
- }
- public void setTwitter(String twitter) {
- this.twitter = twitter;
- }
- public String getMail() {
- return mail;
- }
- public void setMail(String mail) {
- this.mail = mail;
- }
- public Telephone getTelephone() {
- return telephone;
- }
- public void setTelephone(Telephone telephone) {
- this.telephone = telephone;
- }
- }
|
Users
Code :
- package com.example.parsingtest;
- import java.util.ArrayList;
- import java.util.HashMap;
- public class Users extends HashMap<String, ArrayList<User>> {
- private static final long serialVersionUID = 1L;
- }
|
Telephone
Code :
- package com.example.parsingtest;
- import org.json.JSONObject;
- public class Telephone extends JSONObject {
- private String fixe;
- private String mobile;
- public String getFixe() {
- return fixe;
- }
- public void setFixe(String fixe) {
- this.fixe = fixe;
- }
- public String getMobile() {
- return mobile;
- }
- public void setMobile(String mobile) {
- this.mobile = mobile;
- }
- }
|
MainActivity
Code :
- package com.example.parsingtest;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- private UsersController usersController;
- private TextView displayJson;
- @Override
- public void onCreate(Bundle savedInstanceState) {
-
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- usersController = new UsersController();
- displayJson = (TextView) findViewById(R.id.jsonDisplay);
- Button startParsing = (Button) findViewById(R.id.startParsing);
- startParsing.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- gettingJson();
- }
- });
- }
- final void gettingJson() {
-
- final Thread checkUpdate = new Thread() {
- public void run() {
- usersController.init();
- final StringBuilder str = new StringBuilder("user :\n " );
- for (User u : usersController.findAll()) {
- str.append("\n" ).append("first name : " ).append(u.getFirstname());
- str.append("\n" ).append("last name : " ).append(u.getLastname());
- str.append("\n" ).append("login : " ).append(u.getLogin());
- str.append("\n" ).append("twitter : " ).append(u.getTwitter());
- str.append("\n" ).append("Mail : " ).append(u.getMail());
- str.append("\n" ).append("Mobile : " ).append(u.getTelephone().getMobile());
- str.append("\n" ).append("Fixe : " ).append(u.getTelephone().getFixe());
- str.append("\n" );
- }
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- displayJson.setText(str.toString());
- }
- });
- }
- };
- checkUpdate.start();
- }
- }
|
Mais j'ai un gros problème avec un fichier de type :
Code :
- {
- "attribut": "",
- "objetUsers" :
- {
- "Users": [
- {
- "firstname": "",
- "lastname": "",
- "login": "",
- "twitter": "",
- "mail": "",
- "telephone" :
- {
- "fixe": "",
- "mobile": ""
- }
- },
- {
- "firstname": "",
- "lastname": "",
- "login": "",
- "twitter": "",
- "mail": "",
- "telephone" :
- {
- "fixe": "",
- "mobile": ""
- }
- }
- ]
- }
- }
|
Ces lignes en plus...
Code :
- {
- "attribut": "",
- "objetUsers" :
- {
|
J'ai tenter de modifier avec le code suivant...
ObjetUsers
Code :
- package com.example.parsingtest;
- import org.json.JSONObject;
- public class ObjetUsers extends JSONObject {
- private Users users;
- public Users getUsers() {
- return users;
- }
- public void setUsers(Users objetUsers) {
- this.users = objetUsers;
- }
- }
|
Users
Code :
- package com.example.parsingtest;
- import java.util.ArrayList;
- public class Users {
- private ArrayList<User> listUser;
- public ArrayList<User> getListUser() {
- return listUser;
- }
- public void setListUser(ArrayList<User> listUser) {
- this.listUser = listUser;
- }
- }
|
User
Code :
- package com.example.parsingtest;
- public class User {
- private String firstname;
- private String lastname;
- private String login;
- private String twitter;
- private String mail;
- private Telephone telephone;
- public User() {
- super();
- this.firstname = "";
- this.lastname = "";
- this.login = "";
- this.twitter = "";
- this.mail = "";
- this.telephone = null;
- }
- public User(String firstName, String lastName, String login,
- String twitter, String web) {
- super();
- this.firstname = firstName;
- this.lastname = lastName;
- this.login = login;
- this.twitter = twitter;
- this.mail = web;
- }
- public String getFirstname() {
- return firstname;
- }
- public void setFirstname(String firstName) {
- this.firstname = firstName;
- }
- public String getLastname() {
- return lastname;
- }
- public void setLastname(String lastName) {
- this.lastname = lastName;
- }
- public String getLogin() {
- return login;
- }
- public void setLogin(String login) {
- this.login = login;
- }
- public String getTwitter() {
- return twitter;
- }
- public void setTwitter(String twitter) {
- this.twitter = twitter;
- }
- public String getMail() {
- return mail;
- }
- public void setMail(String mail) {
- this.mail = mail;
- }
- public Telephone getTelephone() {
- return telephone;
- }
- public void setTelephone(Telephone telephone) {
- this.telephone = telephone;
- }
- }
|
Telephone
Code :
- package com.example.parsingtest;
- import org.json.JSONObject;
- public class Telephone extends JSONObject {
- private String fixe;
- private String mobile;
- public String getFixe() {
- return fixe;
- }
- public void setFixe(String fixe) {
- this.fixe = fixe;
- }
- public String getMobile() {
- return mobile;
- }
- public void setMobile(String mobile) {
- this.mobile = mobile;
- }
- }
|
UsersController
Code :
- package com.example.parsingtest;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.util.ArrayList;
- import org.codehaus.jackson.JsonFactory;
- import org.codehaus.jackson.JsonParseException;
- import org.codehaus.jackson.JsonParser;
- import org.codehaus.jackson.map.ObjectMapper;
- import android.os.Environment;
- public class UsersController {
- private static final String DL_URL = "http://s414547850.onlinehome.fr/users.json";
- private ObjectMapper objectMapper = null;
- private JsonFactory jsonFactory = null;
- private JsonParser jp = null;
- private ArrayList<User> userList = null;
- private Parse parse = null;
- private File jsonOutputFile;
- private File jsonFile;
- public UsersController() {
- objectMapper = new ObjectMapper();
- jsonFactory = new JsonFactory();
- }
- public void init() {
- downloadJsonFile();
- try{
- jp = jsonFactory.createJsonParser(jsonFile);
- parse = objectMapper.readValue(jp, Parse.class);
- userList = parse.getObjetUsers().getUsers().getListUser();
- } catch(JsonParseException e) {
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- private void downloadJsonFile() {
- try{
- createFileAndDirectory();
- URL url = new URL(UsersController.DL_URL);
- HttpURLConnection urlConnection;
- urlConnection = (HttpURLConnection) url.openConnection();
- urlConnection.setRequestMethod("GET" );
- urlConnection.setDoOutput(true);
- urlConnection.connect();
- FileOutputStream fileOutput = new FileOutputStream(jsonFile);
- InputStream inputStream = urlConnection.getInputStream();
- byte[] buffer = new byte[1024];
- int bufferLength = 0;
- while((bufferLength = inputStream.read(buffer)) > 0) {
- fileOutput.write(buffer, 0, bufferLength);
- }
- fileOutput.close();
- } catch(MalformedURLException e) {
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
- private void createFileAndDirectory() throws FileNotFoundException {
- final String extStorageDirectory = Environment
- .getExternalStorageDirectory().toString();
- final String meteoDirectory_path = extStorageDirectory + "/tutos-android";
- jsonOutputFile = new File(meteoDirectory_path, "/" );
- if(jsonOutputFile.exists() == false)
- jsonOutputFile.mkdirs();
- jsonFile = new File(jsonOutputFile, "users.json" );
- }
- public ArrayList<User> findAll() {
- return userList;
- }
- public User findById(int id) {
- return userList.get(id);
- }
- }
|
Parse
Code :
- package com.example.parsingtest;
- public class Parse {
- private String attribut;
- private ObjetUsers objetUsers;
- public String getAttribut() {
- return attribut;
- }
- public void setAttribut(String attribut) {
- this.attribut = attribut;
- }
- public ObjetUsers getObjetUsers() {
- return objetUsers;
- }
- public void setObjetUsers(ObjetUsers objetUsers) {
- this.objetUsers = objetUsers;
- }
- }
|
... Mais cela ne fonctionne pas. Voici le logcat :
Code :
- 01-05 21:51:51.649: D/dalvikvm(327): GC freed 5586 objects / 356272 bytes in 59ms
- 01-05 21:51:51.829: D/dalvikvm(327): GC freed 13527 objects / 590536 bytes in 54ms
- 01-05 21:51:52.049: D/dalvikvm(327): GC freed 12646 objects / 504056 bytes in 55ms
- 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
- 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"])
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:246)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.StdDeserializer.reportUnknownProperty(StdDeserializer.java:604)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.StdDeserializer.handleUnknownProperty(StdDeserializer.java:590)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:689)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:514)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:356)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
- 01-05 21:51:52.079: W/System.err(327): at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
- 01-05 21:51:52.090: W/System.err(327): at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2376)
- 01-05 21:51:52.090: W/System.err(327): at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1087)
- 01-05 21:51:52.090: W/System.err(327): at com.example.parsingtest.UsersController.init(UsersController.java:41)
- 01-05 21:51:52.090: W/System.err(327): at com.example.parsingtest.MainActivity$2.run(MainActivity.java:37)
- 01-05 21:51:52.090: W/dalvikvm(327): threadid=15: thread exiting with uncaught exception (group=0x4001b188)
- 01-05 21:51:52.090: E/AndroidRuntime(327): Uncaught handler: thread Thread-8 exiting due to uncaught exception
- 01-05 21:51:52.090: E/AndroidRuntime(327): java.lang.NullPointerException
- 01-05 21:51:52.090: E/AndroidRuntime(327): at com.example.parsingtest.MainActivity$2.run(MainActivity.java:39)
- 01-05 21:51:52.109: I/dalvikvm(327): threadid=7: reacting to signal 3
- 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 :
- public void init() {
- downloadJsonFile();
- try{
- jp = jsonFactory.createJsonParser(jsonFile);
- parse = objectMapper.readValue(jp, Parse.class);
- userList = parse.getObjetUsers().getUsers().getListUser();
- } catch(JsonParseException e) {
- e.printStackTrace();
- } catch(IOException e) {
- e.printStackTrace();
- }
- }
|
Merci d'avance... |