Chi*_*kwe 6 java android arraylist gson sharedpreferences
我有一个ArrayList包含ArrayLists各ArrayList在根列表中包含一个ArrayList中Integers和的一个Strings.我正在将它与Gson转换为String以使用SharedPreferences保存它.但是当我重新转换它时,Gson给了我2.131558489E9而不是原来的int 2131558489.我该如何解决这个问题?最好的祝福.
这是我如何转换ArrayList:levelPattern是ArrayList
String levelPatternGson = new Gson().toJson(levelPattern);
Run Code Online (Sandbox Code Playgroud)
这就是我将其转换回来的方式:
levelPattern = new Gson().fromJson(levelPatternGson, ArrayList.class);
Run Code Online (Sandbox Code Playgroud)
整数和双精度之间的json标准没有区别,只有数字类型.这就是为什么gson默认情况下会将数字转换为双精度,如果你不给他你想要的类型.
轻松修复将使用TypeToken和更改数据结构到多个数组或自定义对象(如在@totoro 演示中).
new Gson().fromJson(levelPatternGson, new TypeToken<List<Integer>>() {}.getType());
Run Code Online (Sandbox Code Playgroud)
但您也可以编写自定义List反序列化器:
public static class ListDeserializerDoubleAsIntFix implements JsonDeserializer<List>{
@Override @SuppressWarnings("unchecked")
public List deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return (List) read(json);
}
public Object read(JsonElement in) {
if(in.isJsonArray()){
List<Object> list = new ArrayList<Object>();
JsonArray arr = in.getAsJsonArray();
for (JsonElement anArr : arr) {
list.add(read(anArr));
}
return list;
}else if(in.isJsonObject()){
Map<String, Object> map = new LinkedTreeMap<String, Object>();
JsonObject obj = in.getAsJsonObject();
Set<Map.Entry<String, JsonElement>> entitySet = obj.entrySet();
for(Map.Entry<String, JsonElement> entry: entitySet){
map.put(entry.getKey(), read(entry.getValue()));
}
return map;
}else if( in.isJsonPrimitive()){
JsonPrimitive prim = in.getAsJsonPrimitive();
if(prim.isBoolean()){
return prim.getAsBoolean();
}else if(prim.isString()){
return prim.getAsString();
}else if(prim.isNumber()){
Number num = prim.getAsNumber();
// here you can handle double int/long values
// and return any type you want
// this solution will transform 3.0 float to long values
if(Math.ceil(num.doubleValue()) == num.longValue())
return num.longValue();
else{
return num.doubleValue();
}
}
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
GsonBuilder builder=new GsonBuilder();
List<List> levelPattern = Arrays.asList(Arrays.asList(2131558489L, 2L, 3L),
Arrays.asList("one", "two", "three"));
String levelPatternGson = new Gson().toJson(levelPattern);
List levelPattern2 = new GsonBuilder()
.registerTypeAdapter(List.class, new ListDeserializerDoubleAsIntFix())
.create()
.fromJson(levelPatternGson, List.class);
System.out.println(levelPattern2);
Run Code Online (Sandbox Code Playgroud)
Json:[[2131558489,2,3],["one","two","three"]]
输出:[[2131558489,2,3],[一,二,三]]
我不确定我是否完全理解这个问题......
我假设您ArrayList没有使用泛型。
此解决方案是泛型版本,使用 anObject来保存两个不同类型的ArrayLists。
class Test {
static class Bar {
private List<Integer> integers;
private List<String> strings;
}
public static void main(String[] argv) {
Type baseType = new TypeToken<List<Bar>>() {}.getType();
List<Bar> foos = new ArrayList<>();
Bar bar;
bar = new Bar();
bar.integers = Arrays.asList(1, 2, 3, 4);
bar.strings = Arrays.asList("a", "b", "c", "d");
foos.add(bar);
bar = new Bar();
bar.integers = Arrays.asList(5, 6, 7, 2131558489);
bar.strings = Arrays.asList("e", "f", "g", "h");
foos.add(bar);
Gson gson = new Gson();
String tmp = gson.toJson(foos, baseType);
System.out.println(tmp);
foos = gson.fromJson(tmp, baseType);
System.out.print(foos.get(1).integers.get(3));
}
}
Run Code Online (Sandbox Code Playgroud)
输出
JSON: [{"integers":[1,2,3,4],"strings":["a","b","c","d"]},{"integers":[5,6 ,7,2131558489],"strings":["e","f","g","h"]}]
整数:2131558489
| 归档时间: |
|
| 查看次数: |
9199 次 |
| 最近记录: |