Skip to content

Instantly share code, notes, and snippets.

@cathandnya
Created March 15, 2017 03:01
Show Gist options
  • Save cathandnya/d3eb6970adc27104828679205f577689 to your computer and use it in GitHub Desktop.
Save cathandnya/d3eb6970adc27104828679205f577689 to your computer and use it in GitHub Desktop.
JSON implementation of SharedPreferences
public class Preferences implements SharedPreferences {
File file;
JSONObject json;
Set<OnSharedPreferenceChangeListener> listeners = new HashSet<>();
public Preferences(File file) {
this.file = file;
json = loadJson();
}
JSONObject loadJson() {
try {
InputStream is = new FileInputStream(file);
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
return new JSONObject(new String(buffer, "UTF-8"));
} catch (Exception e) {
}
return new JSONObject();
}
boolean saveJson() {
if (json == null) {
file.delete();
return true;
} else {
OutputStreamWriter writer = null;
try {
writer = new OutputStreamWriter(new FileOutputStream(file));
writer.write(json.toString());
return true;
} catch (Exception e) {
} finally {
try {
writer.close();
} catch (Exception e) {
}
}
}
return false;
}
void set(JSONObject json) {
this.json = json;
}
public static Map<String, Object> jsonToMap(JSONObject json) throws JSONException {
Map<String, Object> retMap = new HashMap<String, Object>();
if(json != JSONObject.NULL) {
retMap = toMap(json);
}
return retMap;
}
public static Map<String, Object> toMap(JSONObject object) throws JSONException {
Map<String, Object> map = new HashMap<>();
Iterator<String> keysItr = object.keys();
while(keysItr.hasNext()) {
String key = keysItr.next();
Object value = object.get(key);
if(value instanceof JSONArray) {
value = toList((JSONArray) value);
}
else if(value instanceof JSONObject) {
value = toMap((JSONObject) value);
}
map.put(key, value);
}
return map;
}
public static List<Object> toList(JSONArray array) throws JSONException {
List<Object> list = new ArrayList<Object>();
for(int i = 0; i < array.length(); i++) {
Object value = array.get(i);
if(value instanceof JSONArray) {
value = toList((JSONArray) value);
}
else if(value instanceof JSONObject) {
value = toMap((JSONObject) value);
}
list.add(value);
}
return list;
}
@Override
public Map<String, ?> getAll() {
try {
return toMap(json);
} catch (Exception e) {
}
return new HashMap<>();
}
@Nullable
@Override
public String getString(String s, @Nullable String s1) {
try {
return json.getString(s);
} catch (Exception e) {
return s1;
}
}
@Nullable
@Override
public Set<String> getStringSet(String s, @Nullable Set<String> set) {
try {
JSONArray ary = json.getJSONArray(s);
if (ary != null) {
Set<String> result = new HashSet<>();
for (int i = 0; i < ary.length(); i++) {
result.add(ary.getString(i));
}
return result;
}
} catch (Exception e) {
}
return set;
}
@Override
public int getInt(String s, int i) {
try {
return json.getInt(s);
} catch (Exception e) {
return i;
}
}
@Override
public long getLong(String s, long l) {
try {
return json.getLong(s);
} catch (Exception e) {
return l;
}
}
@Override
public float getFloat(String s, float v) {
try {
return (float) json.getDouble(s);
} catch (Exception e) {
return v;
}
}
@Override
public boolean getBoolean(String s, boolean b) {
try {
return json.getBoolean(s);
} catch (Exception e) {
return b;
}
}
@Override
public boolean contains(String s) {
return json.has(s);
}
@Override
public Editor edit() {
return new Editor(json);
}
@Override
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener onSharedPreferenceChangeListener) {
listeners.add(onSharedPreferenceChangeListener);
}
@Override
public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener onSharedPreferenceChangeListener) {
listeners.remove(onSharedPreferenceChangeListener);
}
public class Editor implements SharedPreferences.Editor {
JSONObject json;
public Editor(JSONObject json) {
this.json = json;
}
@Override
public SharedPreferences.Editor putString(String s, @Nullable String s1) {
if (s1 != null) {
try {
json.put(s, s1);
} catch (Exception e) {
}
} else {
remove(s);
}
return this;
}
@Override
public SharedPreferences.Editor putStringSet(String s, @Nullable Set<String> set) {
if (set != null) {
try {
JSONArray array = new JSONArray();
for (String str: set) {
array.put(str);
}
json.put(s, array);
} catch (Exception e) {
}
} else {
remove(s);
}
return null;
}
@Override
public SharedPreferences.Editor putInt(String s, int i) {
try {
json.put(s, i);
} catch (Exception e) {
}
return this;
}
@Override
public SharedPreferences.Editor putLong(String s, long l) {
try {
json.put(s, l);
} catch (Exception e) {
}
return this;
}
@Override
public SharedPreferences.Editor putFloat(String s, float v) {
try {
json.put(s, (double) v);
} catch (Exception e) {
}
return this;
}
@Override
public SharedPreferences.Editor putBoolean(String s, boolean b) {
try {
json.put(s, b);
} catch (Exception e) {
}
return this;
}
@Override
public SharedPreferences.Editor remove(String s) {
json.remove(s);
return this;
}
@Override
public SharedPreferences.Editor clear() {
json = new JSONObject();
return this;
}
@Override
public boolean commit() {
apply();
return saveJson();
}
@Override
public void apply() {
set(json);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment