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 nenullové. 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í

Tento web bude tebe a tvůj počítač krmit piškotkami, jelikož a protože je to slušný web a jako takový ví, že je potřeba návštěvu řádně pohostit, aby se u nás cítila dobře. Užíváním tohoto webu potvrzuješ, že netrpíš mentální anorexií, nedržíš žádnou obskurní dietu a že můžeš piškotki do sebe cpát kdykoli a v jakémkoli množství. Více informací...