Created
March 15, 2017 03:01
-
-
Save cathandnya/d3eb6970adc27104828679205f577689 to your computer and use it in GitHub Desktop.
JSON implementation of SharedPreferences
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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