首页 > 解决方案 > 如果您决定重命名类中的字段,如何读取旧的 json 字符串(使用 gson)

问题描述

以前,我们有以下类

public class Checklist {
    private final long id;
    private String text;
    private boolean checked;

    public Checklist(long id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

    public long getId() {
        return id;
    }
}

以下 json 操作(字符串到对象)运行良好。

String string = "[{\"checked\":false,\"id\":0,\"text\":\"Boodschappen\"},{\"checked\":false,\"id\":1,\"text\":\"Melk\"}]";

GsonBuilder builder = new GsonBuilder();
final Gson gson = builder.create();
List<Checklist> checklists = gson.fromJson(string, new TypeToken<List<Checklist>>() {}.getType());

for (Checklist checklist : checklists) {
    System.out.println("--> " + checklist.getText());
}

现在,我们将类“升级”到以下,以节省磁盘空间。

public class Checklist {

    @SerializedName("i")
    private final long id;
    @SerializedName("t")
    private String text;
    @SerializedName("c")
    private boolean checked;

    public Checklist(long id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public boolean isChecked() {
        return checked;
    }

    public void setChecked(boolean checked) {
        this.checked = checked;
    }

    public long getId() {
        return id;
    }
}

它将与新的 json 字符串一起使用

String string = "[{\"c\":false,\"i\":0,\"t\":\"Boodschappen\"},{\"c\":false,\"i\":1,\"t\":\"Melk\"}]";

GsonBuilder builder = new GsonBuilder();
final Gson gson = builder.create();
List<Checklist> checklists = gson.fromJson(string, new TypeToken<List<Checklist>>() {}.getType());

for (Checklist checklist : checklists) {
    System.out.println("--> " + checklist.getText());
}

但是,我们仍然希望能够将旧的 json 字符串转换回新的 Object。

String oldString = "[{\"checked\":false,\"id\":0,\"text\":\"Boodschappen\"},{\"checked\":false,\"id\":1,\"text\":\"Melk\"}]";

我可以知道我怎么能做到这一点?

标签: javajsongson

解决方案


您可以将备用作为参数传递给 SerializedName

@SerializedName(value = "fullName", alternate = "username")

参考这个 Javadoc


推荐阅读