当前位置: 首页 > 知识库问答 >
问题:

Jackson@JsonCreator的属性无法识别

龙才俊
2023-03-14

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

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

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
}

我有一个看起来有点像这样的类“播放器”

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
}

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

我想我弄乱了杰克逊的注释,但我不确定我做错了什么。

共有1个答案

百里飞捷
2023-03-14

您需要在< code>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;
}

顺便说一下,你可以像这样构造你的枚举,Jackson会帮你完成从字符串到枚举的转换。

 类似资料:
  • 我有一个类似的枚举: json文件本身有private字段,所以我需要private(它是java键盘)来进行序列化和映射,但是如果我使用private和所有小写,这将是一个运行时错误。我使用了上面代码中的@JSONProperty,但仍然不起作用。 进程已完成,退出代码为0

  • 我有一个带有javamail的spring启动应用程序,我配置了spring。属性,但似乎不需要属性来发送电子邮件。 下面是发送电子邮件的java代码 pom.xml 这里我们看到了这个错误 组织。springframework。邮政MailSendException:邮件服务器连接失败;嵌套的异常是com。太阳邮政util。MailConnectException:无法连接到主机,端口:loca

  • 问题内容: 在我的实体类中,我试图创建一个只写字段(在序列化期间会被忽略,但通常会反序列化)。 这 几乎 给了我想要的东西:JSON包含“ password”字段,但该值始终为null。如何完全删除该字段? 问题答案: 使用上只是 吸气 ,而不是使用。然后也用在 二传手 。 这应该允许反序列化,但是序列化的JSON输出将不包含它。 例如,将以其他方式表示要序列化的属性(例如“ getValue”以

  • 我在Scala中使用Jackson作为映射器定义了以下类。 插入mongoDB工作没有问题,一个会自动为每个文档插入。 但现在我想尝试读取(或反序列化)文档,例如通过调用。这总是会导致_id出现我使用和。即使有自己的ObjectId,这也不起作用,因为和被视为不同的对象。 有人能帮助我们如何获取实例或如何正确地反序列化吗?提前谢谢

  • 问题内容: Java SE 6项目是否支持eclipselink jpa2的标准api?如果没有,那是我的问题。我是否需要在persistence.xml中为条件api指定特殊的内容? 这是我的条件查询: 这是我的意思实体: 问题答案: 关于您的代码 我没有检查条件查询本身的正确性,但是,正如克里斯所提到的,您正在将静态元模型类与不会暴露您所要查找的混合在一起。假设已经生成了元模型类,请删除第一行

  • 我必须在其他类中使用的所有set和get方法,所以我不能删除一个方法。当我召唤 它提示异常,jackon不知道设置了哪个方法,所以我使用了@jsonignore,但我发现receive是null。