package org.solovyev.android.calculator.json; import static android.text.TextUtils.isEmpty; import android.support.annotation.NonNull; import android.util.Log; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.solovyev.android.io.FileSystem; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.Nonnull; public final class Json { @NonNull private static final String TAG = "Json"; private Json() { } @NonNull public static <T> List<T> fromJson(@NonNull JSONArray array, @NonNull Creator<T> creator) { final List<T> items = new ArrayList<>(array.length()); for (int i = 0; i < array.length(); i++) { final JSONObject json = array.optJSONObject(i); if (json == null) { continue; } try { items.add(creator.create(json)); } catch (JSONException e) { Log.e(TAG, e.getMessage(), e); } } return items; } @NonNull public static JSONArray toJson(@NonNull List<? extends Jsonable> items) { final JSONArray array = new JSONArray(); for (int i = 0; i < items.size(); i++) { final Jsonable item = items.get(i); try { array.put(i, item.toJson()); } catch (JSONException e) { Log.e(TAG, e.getMessage(), e); } } return array; } @Nonnull public static <T> List<T> load(@Nonnull File file, @NonNull FileSystem fileSystem, @NonNull Creator<T> creator) throws IOException, JSONException { if (!file.exists()) { return Collections.emptyList(); } final CharSequence json = fileSystem.read(file); if (isEmpty(json)) { return Collections.emptyList(); } return fromJson(new JSONArray(json.toString()), creator); } public interface Creator<T> { @NonNull T create(@NonNull JSONObject json) throws JSONException; } }