Jackson ObjectMapper обрабатывает длинные типы Java как числа, а не как целые числа

Используя 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"
    }
  }
}

«Число» не является лучшим представлением длинного, так как когда я в другом месте пытаюсь сгенерировать pojos ИЗ схемы, я получаю «двойное», а не «длинное» (или даже «целое» было бы в порядке).

В соответствии с этим в 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);
}

Короче говоря: возможно ли переопределить стандартные сериализаторы или мне нужно войти и взломать сгенерированный вывод?


person StormeHawke    schedule 13.01.2015    source источник
comment
если есть целочисленный тип данных, который вам больше подходит, вы должны изменить свою модель, чтобы использовать целое число вместо длинного. Длинное != целое число   -  person tddmonkey    schedule 13.01.2015
comment
не верно в json-land. В json есть два типа чисел: число, которое включает любое число с плавающей запятой, и целое число, которое включает любое целочисленное число (математическое целое число, а не целое число типа Java. Сюда входят длинные числа)   -  person StormeHawke    schedule 13.01.2015
comment
Я этого не знал! Я удалю свой комментарий после того, как у вас будет достаточно времени, чтобы увидеть это....   -  person tddmonkey    schedule 13.01.2015
comment
ой... больно :(   -  person tddmonkey    schedule 13.01.2015
comment
Извиняюсь. Не хотел обидеть   -  person StormeHawke    schedule 13.01.2015


Ответы (1)


Похоже, вы используете старую версию Джексона. Рекомендуем вам сначала попробовать Jackson2 с последней версией здесь: https://maven-repository.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

person Dan Halperin    schedule 14.01.2015
comment
Модуль Jackson Schema не работает для создания схем для классов со встроенными типами перечислений. Он просто удаляет перечисления и оставляет меня с простым типом String. Я подал отчет об ошибке. github.com/FasterXML/jackson-module-jsonSchema/issues/57 - person StormeHawke; 14.01.2015
comment
Кроме того, stackoverflow.com/questions/27863689/ - person StormeHawke; 14.01.2015