将ArrayList与Gson转换为String

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)

var*_*ren 6

整数和双精度之间的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],[一,二,三]]


tot*_*oro 6

我不确定我是否完全理解这个问题......

我假设您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