【问题标题】:Unrecognised Property with Jackson @JsonCreator杰克逊 @JsonCreator 无法识别的财产
【发布时间】:2015-09-28 06:44:18
【问题描述】:

我正在尝试使用 Jackson 将一些 JSON 转换为一个类的实例,该类包含一些简单的字符串和另一个类,我正在使用 @JsonCreator。杰克逊似乎无法创建其他类的实例。

问题在于,当我将此代码作为测试的一部分运行时:

ObjectMapper mapper = new ObjectMapper();
Player player = mapper.readValue(json.toString(), Player.class);

我得到以下异常:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "characterClass" (class xxx.xxx.Player), not marked as ignorable (2 known properties: "name", "character"])

我在简单测试中尝试解析的 JSON 如下所示:

{
    "name": "joe",
    "characterClass": "warrior",
    "difficulty": "easy",
    "timesDied": 2
}

我有一个看起来有点像这样的类 'Player'

public class Player {

    @JsonProperty("name")
    private String playerName;

    @JsonProperty // <-- This is probably wrong
    private Character character;

    // Some getters and setters for those two fields and more
}

还有一个看起来像这样的“字符”类

public class Character{
    private PlayerClass playerClass;
    private Difficulty difficulty;
    private int timesDied;

    @JsonCreator
    public Character(@JsonProperty("characterClass") String playerClass,
                       @JsonProperty("difficulty") String diff,
                       @JsonProperty("timesDied") int died) {

        // Validation and conversion to enums

        this.playerClass = PlayerClass.WARRIOR;
        this.difficulty = Difficulty.EASY;
        this.timesDied = died;
    }

    // Again, lots of getters, setters, and other stuff
}

对于像这样的小数据集,有更好的方法来构建整个数据,但我认为这只是为了举例。我的真实代码更复杂,但我想做一个简单的例子。

我认为我搞砸了 Jackson 注释,但我不确定我做错了什么。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您需要在Player 上指定与您的 JSON 输入相匹配的创建者。例如:

    @JsonCreator
    public static Player fromStringValues(@JsonProperty("name") String name,
                                          @JsonProperty("characterClass") String characterClass,
                                          @JsonProperty("difficulty") String difficulty,
                                          @JsonProperty("timesDied") Integer timesDied) {
        Player player = new Player();
        player.setPlayerName(name);
        player.setCharacter(new Character(characterClass, difficulty, timesDied));
        return player;
    }
    

    附带说明,您可以像this 这样构建枚举,Jackson 会为您完成从字符串到枚举的转换。

    【讨论】:

    • 有没有办法做到这一点,而不必将每个属性都列为参数?我希望能够根据它需要的三个属性创建“字符”类,而不是其他东西。
    • @CharlieHurrell 这很方便,但是如果您不遵循默认反序列化,则必须为 Jackson 提供创建者。例如,如果您在PlayerCharacter 上有一个name 字段,它怎么知道该怎么做。必须提供说明。
    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多