Android: zpracování JSON objektu
Android obsahuje JSON parser již od API level 1. Pojďme ho trochu vylepšit.
Znáte ten pocit, kdy se zpětně podíváte na svůj vlastní zdroják a nejste s ním spokojeni? Když jsem revidoval načítání příspěvků v aplikaci Pobyty na Moravě, objevil jsem dvě opakující se úlohy. Přidejte k tomu fakt, že zpracování JSON objektů musíte programovat defenzivně kvůli nutnosti častých kontrol null
. Potřeba naprogramovat obecné řešení se sama přihlásí.
Lepší zpracování JSONArray
Pole JSON objektů je implementováno třídou JSONArray
. Osobně bych ale preferoval klasické pole nebo seznam objektů typu JSONObject
, který mohu snadno procházet cyklem foreach
.
Řešením je metoda optJSONArray(JSONObject in, String key)
, která místo objektu JSONArray
vrací seznam objektů JSONObject
. Objekty v poli jsou kontrolovány na null
a do výsledného seznamu jsou zařazeny pouze ty nenull
ové. Pokud je neplatné pole jako celek, vrací metoda prázdný seznam. Procházení jednotlivých prvků v poli se výrazně usnadní a zpřehlední.
for (JSONObject post : JSONTools.optJSONArray(response, "posts")) {
...
}
Použito celkem třikrát: při vlastním načítání příspěvků, při načítání kategorií a při procházení obrázků coby attachmentů k příspěvku.
Získávání hodnot vnořených objektů
Při načítání příspěvků nepotřebuji implementovat kompletní strukturu, stačí jenom části relevantní pro aplikaci. U náhledových obrázků stačí pouze jejich URL. To však znamená projít několik vnořených JSON objektů a na každé úrovni provést kontrolu na null
.
Řešením je metoda optString(JSONObject in, String... keys)
, která přijímá základní JSON objekt a názvy jednotlivých vnořených objektů - něco jako XPATH. Pokud je na některé úrovni nalezena neplatná hodnota, vrací metoda null
. Výsledný zdroják pro načítání URL obrázku je výrazně čitelnější.
String img = JSONTools.optString(post, "thumbnail_images", "full", "url");
Použito také třikrát.
Vlastní implementace
package eu.cranion.pobytynamorave.tools;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class JSONTools {
public static List<JSONObject> optJSONArray(JSONObject in, String key) {
List<JSONObject> retval = new ArrayList<>();
if(in != null) {
JSONArray array = in.optJSONArray(key);
if(array != null) {
for(int i = 0; i < array.length(); i++) {
JSONObject object = array.optJSONObject(i);
if(object != null) {
retval.add(object);
}
}
}
}
return retval;
}
public static String optString(JSONObject in, String... keys) {
if(in == null || keys.length == 0) {
return null;
}
if(keys.length == 1) {
return in.optString(keys[0]);
}
return optString(in.optJSONObject(keys[0]), Arrays.copyOfRange(keys, 1, keys.length));
}
}
A to je celé. Jednoduché a přehledné. Zlepší kvalitu zdrojáku a na výkonu neubere.
Tagy: Android, Pobyty na Moravě, Java, Programování