【问题标题】:Jackson represent Java String as Json numbers or StringsJackson 将 Java 字符串表示为 Json 数字或字符串
【发布时间】:2018-04-01 16:57:00
【问题描述】:

我有以下 java 类,例如 Employee

class Employee{
      String empId; 
}

当我使用 Jackson Object Mapper 序列化这个 java 类时,如果员工 ID 为 123,我会得到示例 Json 输出。

{
 "empId":"123"
}

如果 emp Id 纯粹是一个数字,例如 123,我需要的是以下输出

{
 "empId":123
}

并且,如果员工 ID 是“A123”

{
 "empId":"A123"
}

我可以编写自定义 Serializer 类并使用自定义 Serializer 注释 empId,但是在包含许多对象的大型代码库上执行此操作是一个乏味的过程。

Jackson 是否带有任何开箱即用的功能来检查字符串是否为数字,然后将其表示为数字或在序列化过程中将其表示为字符串,类似于将数字写入字符串功能

请告诉我你的建议。

【问题讨论】:

  • 为什么不在您的客户上处理这种特殊情况?而不是在服务器上做很多工作?
  • 对不起,这不能在客户端完成。这就是我们尝试在服务器上执行此操作的原因。
  • 但是您需要 2 种不同数据类型的用例的原因是什么?

标签: java json serialization jackson2


【解决方案1】:

您的示例在基础上是错误的。

您尝试违反数据类型的主体。

您认为任何客户端如何区分字段“empId”的值类型?

必须只有一种类型 - 字符串或数字。时期。

否则客户端解析器会很痛苦。当一个实例的相同字段是字符串而另一个实例是数字时,无法解析相同的 JSON 结构。

【讨论】:

  • 消费者已经在使用遗留服务。对于我上面提到的情况,消费者可能只使用字符串,然后这种情况的问题就结束了。但是,如果我有字段的字符串返回类型,并且在字符串返回类型中填充的值是一个数字,那么遗留服务有一个功能(错误)来检测它是一个字符串还是一个数字。一些使用此服务的消费者可能会将此值用作字符串,而其他一些消费者可能会将其用作数字。我不想因为遗留服务中的这个功能(错误)而破坏任何一个消费者。
  • 非常糟糕的方法...无论如何,没有任何公共工具可以执行违反规范的操作,以满足人们可能制造的任何可能的错误、错误和糟糕的设计。
  • 同意你的 cmets
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
相关资源
最近更新 更多