我有一个Android应用程序,在某些地方生成JSON,将其序列化,然后在以后对其进行反序列化并使用数据。我使用内置的JSONObject在Android 5及更高版本上查看org.json包。
我的应用在所有Android 5.0和更新的设备上运行正常,但在Android 4.x上,它在某些地方失败了。在调试器中查看反序列化的JSONObject看起来有点破碎。
这似乎是JSON库中的一些错误,它附带了较旧的android,我只想使用MavenCentral或JCenter中较新的最新版本
我该怎么做?我添加了
compile 'org.json:json:20160212'
到我应用的build.gradle依赖项部分,但它似乎没有任何区别。
这是可能的还是旧的破坏的android系统库总能获胜?
更新:事实证明,这不是JSON解析中的错误,而是JSON生成中的错误。该应用程序从Java Map
和List
对象生成JSON - 在Android 4中导致错误的字符串输出:
更多细节在这里:
http://fupeg.blogspot.co.nz/2011/07/android-json-bug.html
我通过编写以下两个函数解决了这个问题:
public static JSONObject mapToJSON(Map<String,Object> map){
HashMap<String,Object> fixed = new HashMap<>();
for (String key : map.keySet()){
Object value = map.get(key);
if (value instanceof Map){
value = mapToJSON((Map<String,Object>) value);
} else if (value instanceof List) {
value = listToJSON((List<Object>)value);
}
fixed.put(key,value);
}
return new JSONObject(fixed);
}
public static JSONArray listToJSON(List<Object> list) {
JSONArray result = new JSONArray();
for (Object value : list){
if (value instanceof Map){
value = mapToJSON((Map<String,Object>) value);
} else if (value instanceof List) {
value = listToJSON((List<Object>)value);
}
result.put(value);
}
return result;
}
并替换应用中的所有电话
new JSONObject(someList)
已替换为listToJSON(someList)
new JSONObject(someMap)
已替换为mapToJSON(someMap)
问题仍然存在。如果我不必实施此解决方法,它可以更好地捆绑更新版本的org.json
库,以便在Android 4.0上使用。有谁知道我怎么可能在Android上这样做?或者,如果不可能?