【问题标题】:Jackson ObjectMapper treats "long" java types as "number" instead of "integer"Jackson ObjectMapper 将“长”Java 类型视为“数字”而不是“整数”
【发布时间】:2015-01-13 18:59:55
【问题描述】:

使用org.codehaus.jackson.map.ObjectMapper(不是数据绑定版本!)我正在从以下对象生成一个 json 模式:

public class MyModelObject {    
    private long fileSize;
    //... other properties, getters, setters etc
}

使用以下代码:

ObjectMapper mapper = new ObjectMapper();
JsonSchema schema = mapper.generateJsonSchema(clazz);
String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);

我得到以下架构(精简到相关部分):

{
  "type" : "object",
  "properties" : {
    "fileSize" : {
      "type" : "number"
    }
  }
}

“number”不是 long 的最佳表示,因为当我在其他地方尝试从模式生成 pojos 时,我得到的是“double”而不是“long”(甚至“int”也可以)。

据此,json 中有一个“整数”数据类型可以更好地满足我的需求: http://spacetelescope.github.io/understanding-json-schema/reference/numeric.html

但是通过挖掘 jackson-mapper 模块的源代码,我发现他们使用了一个名为 LongSerializer 的标准序列化程序,包含在此类中:org.codehaus.jackson.map.ser.StdSerializers

相关部分是这个方法:

@Override
public JsonNode getSchema(SerializerProvider provider, Type typeHint)
{
    return createSchemaNode("number", true);
}

长话短说:是否可以覆盖标准序列化程序,还是我需要进入并破解生成的输出?

【问题讨论】:

  • 如果有更适合您的整数数据类型,您应该更改模型以使用整数而不是长整数。长 != 整数
  • 在 json-land 中不正确。在 json 中,有两种数字类型——“数字”包括任何浮点数,“整数”包括任何整数样式的数字(数学上的整数,而不是 java 类型的整数。这包括长整数)
  • 我不知道这个!在您有足够的时间看到此内容后,我将删除我的评论....
  • 哎哟...伤害了:(
  • 对不起。不是故意伤害人

标签: java json jackson jsonschema jackson-modules


【解决方案1】:

您使用的好像是旧版本的 Jackson。推荐你先试用 Jackson2,最新版本在这里:https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core/2.5.0

看起来较新的 json 模式模块可能会为整数做正确的事情:https://github.com/FasterXML/jackson-module-jsonSchema/blob/master/src/main/java/com/fasterxml/jackson/module/jsonSchema/types/IntegerSchema.java

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2010-11-22
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多