使用Gson将对象序列化为任意JSON数组而不会收到警告

时间:2012-12-05 12:54:17

标签: java gson

我需要像这样序列化一个对象:

class A {
    int a = 1;
    String b = "hello";
    boolean isDog = false;
}

进入这样的JSON数组:

[1,"hello",false]

我知道一种(错误的)方法:从对象的字段中创建一个无类型的Collection,然后是Gson:

class A {
    // ...
    Collection forGson() {
        ArrayList col = new ArrayList();
        col.add(a);
        col.add(b);
        col.add(c);
        return col;
    } 
}
new Gson().toJson(new A().forGson());

但是由于无类型的集合使用,它会产生很多警告。那么有没有办法将对象序列化为任意类型的数组而不会收到任何警告?

1 个答案:

答案 0 :(得分:3)

字面意思是“你做错了”。你没有随机数组,你有一个(A)对象。它与您想要生成的JSON没有 nothing

话虽如此,如果你真的想这样做,你可以将自己的Serializer / Deserializer提供给Gson

class ASerializer implements JsonSerializer<A>
{

    public JsonElement serialize(A t, Type type, JsonSerializationContext jsc)
    {
        JsonArray ja = new JsonArray();
        ja.add(new JsonPrimitive(t.a));
        ja.add(new JsonPrimitive(t.b));
        ja.add(new JsonPrimitive(t.isDog));
        return ja;
    }

}

你创建一个反向的JsonDeserializer,从提供的JSON数组创建一个A对象。

有关详情,请参阅:https://sites.google.com/site/gson/gson-user-guide#TOC-Custom-Serialization-and-Deserialization

然后使用GsonBuilder您告诉Gson使用它们:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(A.class, new ASerializer());
builder.registerTypeAdapter(A.class, new ADeserializer());
Gson gson = builder.create(); 
...