在 JAVA 中的 JSON 反序列化期间更改两个字段名称

Changing two filed names during JSON deserialization in JAVA

我有一个 json 文件

{"apple" : [
        {
            "first"    : 3,
            "second"    : 5,

        }
      ],
"orange" : [
        {
            "fst"    : 7,
            "snd"    : 8,

        }
      ],
}

用于反序列化的助手class


public class Helper {

    private int num1;

    private int num2;

    public Helper(Helper other) {
        this.num1 = other.num1;
        this.num2 = other.num2;
    }

    public int getNum1() {
        return this.num1;
    }

    public int getNum2() {
        return this.num2;
    }
}

A java class 用于反序列化,我需要更改 JSON 键以与 Helper class 的实例名称兼容。

public class MyDesClass {

    @SerializedName(value = "apple.first", alternate = "apple.num1")
    @SerializedName(value = "apple.seconds", alternate = "apple.num2")
    private final Helper[] apple;

    public MyDesClass(Helper[] apple) {
        this.apple = apple;
    }
    
}          

而且,也在 main.java 里面,我有:

/* .... */
        Reader f = new FileReader( PATH_TO_THE_JSON_FILE);
        Gson gson = new Gson();
        GameBoard gameBoard = gson.fromJson(f, MyDesClass.class);
/* .... */

我的问题是如何在 MyDesClass?目前,我收到 SerializedName is not a repeatable annotation type 错误。

您需要在 Helper class 中使用 @SerializedName(并根据需要更新 MyDesClass):

public class Helper {

    @SerializedName(value = "first" alternate={"num1","fst"})
    private int num1;

    @SerializedName(value = "second" alternate={"num2","snd"})
    private int num2;

    public Helper(Helper other) {
        this.num1 = other.num1;
        this.num2 = other.num2;
    }

    public int getNum1() {
        return this.num1;
    }

    public int getNum2() {
        return this.num2;
    }
}

为了符合更新后的 JSON,MyDesClass 需要有另一个字段 orange:

public class MyDesClass {

    @SerializedName("apple")
    private final Helper[] apple;

    @SerializedName("orange")
    private final Helper[] orange;

    public MyDesClass(Helper[] apple, Helper[] orange) {
        this.apple = apple;
        this.orange = orange;
    }
// ...    
}