deserialisiert ein JSON-Objekt mit mehreren Elementen drin
Ich versuche zu Deserialisieren (mit gson) ein JSON-Objekt, das aussieht wie dieses:
"attachments": {
"40": {
"ID": 40,
"URL": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/wreckit.jpg",
"guid": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/wreckit.jpg",
"mime_type": "image\/jpeg",
"width": 287,
"height": 400
},
"3": {
"ID": 3,
"URL": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/frankenweenie2bposter.jpg",
"guid": "http:\/\/drewmore4.files.wordpress.com\/2013\/02\/frankenweenie2bposter.jpg",
"mime_type": "image\/jpeg",
"width": 273,
"height": 400
}
},
Wie kann ich das umgehen? Ich weiß gar nicht, was zu nennen dies - Es gibt mehrere "Elemente" sind hier vertreten, aber es ist nicht ein array. Wenn ich versuche zu Deserialisieren es als ein array, das Programm stürzt ab, auf eine "Erwartete Begin_Array aber gefunden Begin_Object" Ausnahme. Wenn ich versuche zu Deserialisieren es als ein Starkes Objekt (siehe Klasse unten), das Programm läuft aber die Felder alle null zurück.
Hier ist die Klasse, die ich habe versucht, die Karte an:
class Attachment {
int ID;
String URL;
}
den vollständigen JSON-Datei kann gesehen werden hier:
EDIT: GELÖST.
@Wahrnehmung die Lösung im Grunde arbeitete. Es war kompliziert durch die Tatsache, dass dieses "element" (würde noch gerne wissen, was diese multiple-entry - /non-array mit json-element) eingebettet ist in einen größeren json-Objekt enthält ein array. Wieder, diese JSON ist nicht mein design - es kommt aus der WordPress-REST-API, und (wie @Wahrnehmung angedeutet), ich denke, das Problem, das ich habe zeigt ein design-Fehler in es - nämlich, dass die Anlagen-element sollte ein array, anstatt ein einzelnes Objekt. Dennoch,
Dennoch, wenn schon mal jemand braucht Deserialisieren das Ergebnis einer Abfrage für alle Beiträge, die auf einer bestimmten Website, die diese API nutzen, und weiterer Bedarf Zugriff auf die Anhänge, auf jeden post hier ist, wie Sie es tun:
private class getAll extends AsyncTask <Void, Void, JSONObject> {
private static final String url = "https://public-api.wordpress.com/rest/v1/sites/drewmore4.wordpress.com/posts/";
@Override
protected JSONObject doInBackground(Void... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
httpget.addHeader("accept", "application/json");
JSONObject returned = new JSONObject();
HttpResponse response;
try {
response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
String result= convertStreamToString(instream);
returned =new JSONObject(result);
instream.close();
}
}
catch (ClientProtocolException | IOException | JSONException e) { e.printStackTrace();}
return returned;
}
@Override
protected void onPostExecute (JSONObject returned){
Gson gson = new Gson();
//posts is the element within the JSONObject that is an array of post objects
try {
JSONArray posts = returned.getJSONArray("posts");
for (int curr = 0; curr < posts.length(); curr++){
String s = posts.get(curr).toString();
Article a = gson.fromJson(s, Article.class);
JSONObject attachments = new JSONObject(s).getJSONObject("attachments");
final Iterator<String> keys = attachments.keys();
while(keys.hasNext()) {
final String key = keys.next();
a.attached.add(gson.fromJson(attachments.getJSONObject(key).toString(), Attachment.class));
}
stories.add(a);
}
} catch (JSONException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein Beispiel für Daten, die wahrscheinlich sollte wurden serialisiert ein array, aber war nicht. Eine Lösung, die analysiert wird, ist die Verwendung einer
JSONObject
direkt.Daten kann auch gesehen werden, als eine Karte, von id ' s zu Anlagen. Und es kann deserialisiert werden als solche:
Dies ist aktuellen
Article
mitAttachment
).Ersten erstellen JSONArray aus diesem JSONObject.,
dann
Durch die Nutzung dieser Schleife erhalten Sie die string-Werte und setzen Sie in eine Karte oder ein Objekt, die u wollen, und fügen Sie es zu einem ArrayList -
Und
können Sie dann Werte.
Es sieht aus wie die Sammlung von JSON ist ein natürlicher Sitz für eine
java.util.map
. Also, ich würde wahrscheinlich Deserialisieren die JSON - "Anhänge" in eineMap<String, Atachment>
. Die Karte ist dann einfach zu Durchlaufen, oder verwandeln die Sammlung der Anlage die Werte in eine andere Art von Sammlung, wie einList<Attachment>
oder eineAttachment[]
.Hinweis: Die Gson-Benutzerhandbuch enthält ein Beispiel deserialisiert eine Generische Auflistung.