Почему Джексон позволяет байтовому значению больше MAX_BYTE - PullRequest
1 голос
/ 06 мая 2020

Я получаю недопустимое значение поля Byte при десериализации.

Json:

{"byteField" : 128 }

Java:

class Dto {
     private Byte byteField;
     ... getter/setter
}

После десериализация Я получаю Dto.byteField = -128

Я нашел следующий код в библиотеке Jackon-core v.2.11.0 в com.fasterxml.jackson.core.JsonParser#getByteValue

public byte getByteValue() throws IOException {
    int value = getIntValue();
    // So far so good: but does it fit?
    // [JACKSON-804]: Let's actually allow range of [-128, 255], as those are uniquely mapped
    //  (instead of just signed range of [-128, 127])
    if (value < MIN_BYTE_I || value > MAX_BYTE_I) {
        throw new InputCoercionException(this,
                String.format("Numeric value (%s) out of range of Java byte", getText()),
                JsonToken.VALUE_NUMBER_INT, Byte.TYPE);
    }
    return (byte) value;
}

, но не смог найти проблему JACKSON-804, а также любое обсуждение диапазона байтов.

Вопрос:

  • Почему Джексон позволяет байтам быть больше 127?

1 Ответ

3 голосов
/ 06 мая 2020

Java не допускает байтов без знака, но беззнаковое двоичное представление 128 совпадает с двумя дополнениями -128; они оба 0b10000000.

То, что делает Джексон, позволяет вам определять семантику этого поля: это может быть либо 8-битный байт без знака, либо 8-битный байт со знаком . Это противоречит интуиции и, возможно, неверно, но совершенно очевидно, что цель здесь именно в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...