【问题标题】:Deserialize enum into object with string attribute将枚举反序列化为具有字符串属性的对象
【发布时间】:2018-09-03 11:47:58
【问题描述】:

我目前正在尝试将枚举值从 json 反序列化为包含字符串的对象(枚举值应该以该字符串结尾)。

示例: 领域类

public class Person {
private UUID personId;
private Occupation occupation;

}

职业类别:

public class Occupation {
private String occupationType;

}

我运行的代码是:

PersonResponse personResponse = JsonConverter.fromJson(message.getPayload(), new TypeReference<Person>() {
    });

JSON 是:

{"personId":"719e622e-6e00-4e84-b748-739f95d7c0fa", "occupationType":"STATE_EMPLOYEE"

基本上,我希望我的 STATE_EMPLOYEE.name() 值最终出现在 Occupation 类的可用对象中。现在它尝试将值 STATE_EMPLOYEE 反序列化为 Occupation 类的对象,这显然不起作用。

有没有办法让我返回这样的对象?我不想更改我的 Person 对象来保存一个 OccupationType 枚举,因为它还有很多其他的东西。

我收到的错误是:

 Can not construct instance of person.package.Occupation: no String-argument constructor/factory method to deserialize from String value ('STATE_EMPLOYEE')

尝试将我的枚举值放入包含字符串的我的职业对象中基本上失败了。 (我希望我的东西在哪里)。 提前致谢!

【问题讨论】:

  • 你可以写枚举类 OccupationType 值为 State_EMPLOYEE 和 gson 会解析它。如果您在...理解我想说的话时遇到一些问题,我会提供代码。
  • Occupation 是否包含任何其他字段?
  • 是的,我稍微简化了示例。
  • 不,在你说你简化了例子之后,我的评论是错误的。你能提供完整的例子吗? @PrinceofSweden 根据来自错误的信息,由于您的 json 答案的方案,字段占用应该是字符串类型而不是占用。试试看。如果可行,您可以使用一些映射器将您的数据映射到适当的模型。
  • 有很多用于 Java 的 json API。我知道至少有两个有一个名为 JsonConverter 的类,它有一个 fromJson 方法,但都不匹配您传递的参数。所以对我来说,不清楚JsonConverter 是什么,或者您正在使用什么库或自定义类。请提供minimal reproducible example,包括任何导入,并指定您使用的任何第三方工具。根据您使用的内容,可以选择创建和提供自定义类型适配器,这些适配器可以将 String 值转换为您的枚举类型。但如果没有上述信息,就很难提供帮助。

标签: java json json-deserialization


【解决方案1】:

我通过创建自己的自定义反序列化器解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2020-12-12
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多