【问题标题】:gson nested custom serializergson 嵌套自定义序列化程序
【发布时间】:2016-03-08 13:43:52
【问题描述】:

我有一个嵌套对象,我无法用 gson 对其进行序列化。我制作了一个自定义序列化程序,它与父对象一起使用,但与子对象一起使用,我无法让它工作。

所以在我下面的代码中,自定义序列化程序用于序列化Team。这样可行。在这个团队中,我有一个User 列表,我也想对其进行序列化。不幸的是,addProperty(String a, String b) 方法需要 2 个字符串(或一个原语),因此我无法添加属于 User 类的属性成员。

这里是代码,首先我创建一个Gson对象并为Team注册自定义序列化器:

gson = new GsonBuilder().registerTypeAdapter(Team.class, new TeamSerializer())
            .create();
 gson.toJson(userData); // UserData instance.

这是要用Gson对象序列化的类(我省略了用//...表示的无关字段):

public class UserData{
    public Team team;
    //...
}

这是自定义序列化程序,我无法在其中添加属性 members

public class TeamSerializer implements JsonSerializer<Team>{
    @Override
    public JsonElement serialize(Team src, Type type, JsonSerializationContext context) {
        JsonObject object = new JsonObject();
        object.addProperty("id", src.getIdteams());
        object.addProperty("name", src.getName());
        object.addProperty("tag", src.getTag());
        object.addProperty("picture", src.getProfilePic());
        //object.addProperty("members", src.getMembers());
        return object;
    }
}

这是Team 类:

public class Team implements Serializable {
    private long idteams;
    private String name;
    private String tag;
    private String profilePic;
    private List<User> members;
    //...
}

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    TypeToken 描述通用关系并使用上下文来转换列表:

    TypeToken<List<User>> typeDescription = new TypeToken<List<User>>() {};
    JsonElement members = context.serialize(src.getMembers(), typeDescription.getType());
    object.add("members", members);
    

    如果 User 不是标准 bean,您可能也需要一个 TypeAdapter

    【讨论】:

    • 我刚试过这个,编译器说不可能在 List 和 TypeToken 上调用 serialize()。它应该只是列表的列表和类型 Type 的类型,而不是 TypeToken……你知道为什么吗?
    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 2013-09-09
    • 1970-01-01
    • 2013-03-09
    • 2016-02-18
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多