Bonjour,
Comment récupère-t-on une date dans un JSON en Java ?
Merci d'avance pour vos réponses.
Bonjour,
Comment récupère-t-on une date dans un JSON en Java ?
Merci d'avance pour vos réponses.
Bonjour,
La question est un peu vague, Il existe plusieurs manière : il se peut que la date soit au format timestamp (entier long) dans ce cas tu peux faire exemple
Ou bien c'est au format String dans ce cas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 long dateTimeStamp = jsonObject.getLong(clef_json_de_la_date); Date date = new Date(dateTimeStamp);Puis si tu souhaites l'avoir au format Date il faudra le convertir du String au Date.
Code : Sélectionner tout - Visualiser dans une fenêtre à part String dateString = jsonObject.getString(clef_json_de_la_date);
Jettes un oeil sur Joda Time qui te facilitera la manipulation des dates
Bon courage
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
N'oubliez pas de consulter les FAQ Swift, Android
Tutoriel : Développer une application multilingue sous iOS
Bonjour Seelass,
Merci pour ta réponse et bonne année à toi!
En vérité j'ai cette API (je l'affiche en pretty_print) qui me retourne une liste de Musee en JSON : https://opendata.paris.fr/api/record...tty_print=true
Et je dois affiché les données de cette API dans un tableau dans une vue.
Je te montre mon code.
J'ai donc une classe musée qui récupère tous mes champs:
Une class MuseeAdapter pour faire passer mes données une fois parser, vers ma vue:
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244 import android.app.ListActivity; import android.os.Parcel; import android.os.Parcelable; import android.widget.AdapterView; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; public class Musee implements Parcelable { //@Test //public ArrayList<Musee> musees = new ArrayList<Musee>(); private String datasetid; private String recordid; private String fields; private String periode_ouverture; private String nom_du_musee; private String adr; private String ville; private String nomreg; private String ferme; private double coordonnees_[]; private int cp; private String nomdep; private String type; private double coordinates[]; private Date record_timestamp; //On appel le constructeur de notre class dans le main pour afficher la liste des musées? //Mes constructeurs public Musee(String datasetid, String recordid, String fields, String periode_ouverture, String nom_du_musee, String adr, String ville, String nomreg, String ferme, double coordonnees_[], int cp, String nomdep, String type, double coordinates[], Date record_timestamp) { this.datasetid = datasetid; this.recordid = recordid; this.fields = fields; this.periode_ouverture = periode_ouverture; this.nom_du_musee = nom_du_musee; this.adr = adr; this.ville = ville; this.nomreg = nomreg; this.ferme = ferme; this.coordonnees_ = coordonnees_; this.cp = cp; this.nomdep = nomdep; this.type = type; this.coordinates = coordinates; this.record_timestamp = record_timestamp; } //Surcharge du constructeur Musee public Musee(Parcel in) { this.datasetid = datasetid; this.recordid = recordid; this.fields = fields; this.periode_ouverture = periode_ouverture; this.nom_du_musee = nom_du_musee; this.adr = adr; this.ville = ville; this.nomreg = nomreg; this.ferme = ferme; this.coordonnees_ = coordonnees_; this.cp = cp; this.nomdep = nomdep; this.type = type; this.coordinates = coordinates; this.record_timestamp = record_timestamp; } public static final Creator<Musee> CREATOR = new Creator<Musee>() { @Override public Musee createFromParcel(Parcel in) { return new Musee(in); } @Override public Musee[] newArray(int size) { return new Musee[size]; } }; //On appel la methode getMusee() pour récupérer les musées que nous renvoie l'api JSON //Mes accesseurs getter + setter public String getDataSetid() { return this.datasetid; } public String getRecordid() { return this.recordid; } public String getfields() { return this.fields; } public String getPeriode_ouverture() { return this.periode_ouverture; } public String getNom_du_musee() { return this.nom_du_musee; } public String getAdresse() { return this.adr = adr; } public String getVille() { return this.ville = ville; } public String getNomReg() { return this.nomreg = nomreg; } public String getFermer() { return this.ferme = ferme; } public double[] getCoordonnees() { return this.coordonnees_ = coordonnees_; //erreur ici } public int getCP() { return this.cp = cp; } public String getNomDep() { return this.nomdep = nomdep; } public String getType() { return this.type = type; } public double[] getCoordinates() { return this.coordinates = coordinates; //erreur ici } public Date getTime() { return this.record_timestamp; } public void setDataSetid(String datasetid) { this.datasetid = datasetid; } public void setRecordid(String recordid) { this.recordid = recordid; } public void setFields(String fields) { this.fields = fields; } public void setPeriode_ouverture(String periode_ouverture) { this.periode_ouverture = periode_ouverture; } public void setNom_du_musee(String nom_du_musee) { this.nom_du_musee = nom_du_musee; } public void setAdresse(String adr) { this.adr = adr; } public void setVille(String ville) { this.ville = ville; } public void setReg(String nomreg) { this.nomreg = nomreg; } public void setFerme(String ferme) { this.ferme = ferme; } public void setCoordonnes(double coordonnees_[]) { this.coordonnees_ = coordonnees_; } public void setCP(int cp) { this.cp = cp; } public void setCP(String nomdep) { this.nomdep = nomdep; } public void setType(String type) { this.type = type; } public void setCoordinates(double coordinates[]) { this.coordinates = coordinates; } public void setTime(Date record_timestamp) { this.record_timestamp = record_timestamp; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.datasetid); dest.writeString(this.recordid); dest.writeString(this.fields); dest.writeString(this.periode_ouverture); dest.writeString(this.nom_du_musee); dest.writeString(this.adr = adr); dest.writeString(this.ville = ville); dest.writeString(this.nomreg = nomreg); dest.writeString(this.ferme = ferme); dest.writeFloat(this.coordonnees_ = coordonnees_[]); //erreur ici dest.writeInt(this.cp = cp); dest.writeString(this.nomdep = nomdep); dest.writeString(this.type = type); dest.writeFloat(this.coordinates = coordinates[]); //erreur ici dest.writeString(String.valueOf(this.type = type)); } @SuppressWarnings("rawtypes") private static final class CreatorImplementation implements Parcelable.Creator { public Musee createFromParcel(Parcel in) { return new Musee(in); } @Override public Object[] newArray(int size) { // TODO Auto-generated method stub return null; } } }
Et enfin mon Activity qui se nomme MuseeActivity:
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class MuseeAdapter extends ArrayAdapter<Musee> { private int myItemLayout; private LayoutInflater li; public MuseeAdapter(Context context, int resourceId) { super(context, resourceId); this.myItemLayout = resourceId; this.li = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { view = this.li.inflate(this.myItemLayout, null); } Musee f = this.getItem(position); if(f != null) { TextView tv0 = (TextView)view.findViewById(R.id.datasetid); tv0.setText(String.valueOf(f.getDataSetid())); TextView tv1 = (TextView)view.findViewById(R.id.recordid); tv1.setText(String.valueOf(f.getRecordid())); TextView tv2 = (TextView)view.findViewById(R.id.fields); tv2.setText(String.valueOf(f.getfields())); TextView tv3 = (TextView)view.findViewById(R.id.periode_ouverture); tv3.setText(String.valueOf(f.getPeriode_ouverture())); TextView tv4 = (TextView)view.findViewById(R.id.nom_du_musee); tv4.setText(String.valueOf(f.getNom_du_musee())); TextView tv5 = (TextView)view.findViewById(R.id.adresse); tv5.setText(String.valueOf(f.getAdresse())); TextView tv6 = (TextView)view.findViewById(R.id.ville); tv6.setText(String.valueOf(f.getVille())); TextView tv7 = (TextView)view.findViewById(R.id.nomreg); tv7.setText(String.valueOf(f.getNomReg())); TextView tv8 = (TextView)view.findViewById(R.id.fermer); tv8.setText(String.valueOf(f.getFermer())); TextView tv9 = (TextView)view.findViewById(R.id.coordonnees); tv8.setText(String.valueOf(f.getCoordonnees())); TextView tv10 = (TextView)view.findViewById(R.id.cp); tv9.setText(String.valueOf(f.getCP())); TextView tv11 = (TextView)view.findViewById(R.id.nomdepartement); tv11.setText(String.valueOf(f.getNomDep())); TextView tv12 = (TextView)view.findViewById(R.id.type); tv12.setText(String.valueOf(f.getType())); TextView tv13 = (TextView)view.findViewById(R.id.coordinates); tv13.setText(String.valueOf(f.getCoordinates())); TextView tv14 = (TextView)view.findViewById(R.id.record_timestamp); tv14.setText(String.valueOf(f.getTime())); } return view; } }
J'ai actuellement du mal à récupérer le champ "record_timestamp" .
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144 import android.app.ListActivity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; public class MuseeActivity extends ListActivity implements OnItemClickListener { private static final String BASE_URL = "https://opendata.paris.fr/api/records/1.0/search/?dataset=liste-musees-de-france-a-paris&rows=50"; private final class DownloadMusee extends AsyncTask<String, Void, ArrayList<Musee>> { private HttpURLConnection urlConnection; private ProgressDialog progress; public DownloadMusee() { this.progress = new ProgressDialog(MuseeActivity.this); } @Override protected void onPreExecute() { progress.setTitle("Please wait"); progress.setMessage("Fetching remote data..."); progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); progress.show(); } @Override protected ArrayList<Musee> doInBackground(String... params) { ArrayList<Musee> fetchedData = new ArrayList<Musee>(); String stream = null; try { URL url = new URL(params[0]); this.urlConnection = (HttpURLConnection) url.openConnection(); InputStream in = new BufferedInputStream(this.urlConnection.getInputStream()); BufferedReader r = new BufferedReader(new InputStreamReader(in, "UTF-8")); StringBuilder sb = new StringBuilder(); String line; while ((line = r.readLine()) != null) { sb.append(line); } stream = sb.toString(); SimpleDateFormat record_timestamp = new SimpleDateFormat(Musee.getTime()); JSONArray concepts = new JSONObject(stream).getJSONArray("records"); for (int i = 0; i < concepts.length(); ++i) { JSONObject record = concepts.getJSONObject(i); fetchedData.add(new Musee( record.getString("datasetid"), record.getString("recordid"), record.getString("fields"), record.getString("periode_ouverture"), record.getString("nom_du_musee"), record.getString("adr"), record.getString("ville"), record.getString("nomreg"), record.getString("ferme"), record.getDouble("coordonnees_[]"), record.getInt("cp"), record.getString("nomdep"), record.getString("type"), record.getDouble("coordinates[]"), record.getDate("record_timestamp") //erreur ici )); } } catch(Exception e) { Log.e("genDROID","An error occured while fetching", e); } finally { this.urlConnection.disconnect(); } return fetchedData; } public double getFloat( String key ) {}; @Override protected void onPostExecute(ArrayList<Musee> result) { if(progress.isShowing()) progress.dismiss(); MuseeActivity.this.populate(result); } } private MuseeAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.adapter = new MuseeAdapter(this, android.R.layout.simple_list_item_1); this.setListAdapter(adapter); getListView().setOnItemClickListener(this); } @Override protected void onStart() { super.onStart(); new DownloadMusee().execute(BASE_URL); } public void populate(ArrayList<Musee> data) { this.adapter.clear(); this.adapter.addAll(data); this.adapter.notifyDataSetChanged(); } @Override public void onItemClick(AdapterView<?> parent, View arg1, int position, long id) { /* Uncomment if needed Fruit currentFruit = this.adapter.getItem(position); Intent goToNextScreen = new Intent(this, Elsewhere.class); goToNextScreen.putExtra("selected", currentFruit); this.startActivity(goToNextScreen); */ Toast.makeText(this, "You selected item n° " + position, Toast.LENGTH_SHORT).show(); } }
As-tu une idée ?
Merci d'avance pour ton aide.
Si j'ai compris la structure, record_timestamp se trouve dans les objets qui se trouvent dans le noeud records.
Dans ton code juste essaie de changer cette lignepar
Code : Sélectionner tout - Visualiser dans une fenêtre à part record.getDate("record_timestamp") //erreur ici"record_timestamp": "2016-09-02T13:08:03+00:00" est au format String
Code : Sélectionner tout - Visualiser dans une fenêtre à part record.getString("record_timestamp")
Bonne année également
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
N'oubliez pas de consulter les FAQ Swift, Android
Tutoriel : Développer une application multilingue sous iOS
J'ai déjà essayer cette technique, le problème c'est que lorsque je fais ça, dans ma classe Musee, mon
Attends un type "Date" alors qu'il retourne un String.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public Date getTime() { return this.record_timestamp; }
J'ai essayé de clean et de rebuild mon projet.
Et j'ai aussi des erreurs ici que je n'arrive pas à résoudre, il y a des moments je ne comprend pas d'où vient mon problème.
Pour cette parti le problème viens d'où j'ai mis un tableau [] après mes variables coordonnees_ et coordinates.
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 public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.datasetid); dest.writeString(this.recordid); dest.writeString(this.fields); dest.writeString(this.periode_ouverture); dest.writeString(this.nom_du_musee); dest.writeString(this.adr = adr); dest.writeString(this.ville = ville); dest.writeString(this.nomreg = nomreg); dest.writeString(this.ferme = ferme); dest.writeFloat(this.coordonnees_ = coordonnees_[]); //erreur ici dest.writeInt(this.cp = cp); dest.writeString(this.nomdep = nomdep); dest.writeString(this.type = type); dest.writeFloat(this.coordinates = coordinates[]); //erreur ici dest.writeString(String.valueOf(this.type = type)); }
Merci pour ta réponse![]()
Dans ta classe Musee record_timestamp est de type Date donc il faut que tu convertisse avant ce que tu as récupéré dans le json en Date. Cette question est très similaire à ton cas. Espérant ça va t'aider.
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
N'oubliez pas de consulter les FAQ Swift, Android
Tutoriel : Développer une application multilingue sous iOS
Partager