Причина, по которой json не был принят с первым символом атрибутов в верхнем регистре, заключается в том, что библиотека Джексона разрешает имена свойств из методов получения и установки класса, соответствующего json.Джексон создает имена свойств путем преобразования начальных символов текста, следующих за «get», в нижний регистр (из метода get в стороне java).Например: getSubject в классе Student хранится в свойстве, установленном как «subject».
Когда почтовый запрос отправляется с помощью json, атрибуты в json сравниваются с набором свойств.Только те имена атрибутов, которые соответствуют этому набору свойств, будут иметь свои значения, добавленные из json к соответствующему атрибуту java.Когда вы отправляете запрос с именем атрибута json 'Subject', Джексон не будет десериализовать это.Так как имя атрибута 'Subject' не совпадает с 'subject' в наборе свойств.Вот почему для этих атрибутов изначально было значение null.
Выше сказанное является поведением по умолчанию. Чтобы переопределить это поведение, вы можете сопоставить свойство java с желаемым именем атрибута json, используя аннотацию @JsonProperty:
@JsonProperty("Subject")
String Subject;
В противном случае используйте имя атрибута json, начинающееся со строчной буквы. Например: вместо 'субъекта' вместо 'субъекта'
Преобразование в регистр начальных символов можно увидеть в com.fasterxml.jackson.databind.util.Beanutil class.The метод ниже делает это:
protected static String legacyManglePropertyName(final String basename, final int offset)
{
final int end = basename.length();
if (end == offset) { // empty name, nope
return null;
}
// next check: is the first character upper case? If not, return as is
char c = basename.charAt(offset);
char d = Character.toLowerCase(c);
if (c == d) {
return basename.substring(offset);
}
// otherwise, lower case initial chars. Common case first, just one char
StringBuilder sb = new StringBuilder(end - offset);
sb.append(d);
int i = offset+1;
for (; i < end; ++i) {
c = basename.charAt(i);
d = Character.toLowerCase(c);
if (c == d) {
sb.append(basename, i, end);
break;
}
sb.append(d);
}
return sb.toString();
}
Сравнение имени свойства с атрибутом json можно найти в следующем коде (функция deserializeFromObject в com.fasterxml.jackson.databind.deser.Класс BeanDeserializer. Я не вставляю всю функцию, так как она слишком длинная).Переменная p соответствует Jsonparser, а beanProperties содержит имена свойств, разрешенные из getter и setter, метод deserializeAndSet устанавливает значение атрибута json для bean-компонента java:
if (p.hasTokenId(JsonTokenId.ID_FIELD_NAME)) {
String propName = p.getCurrentName();
do {
p.nextToken();
SettableBeanProperty prop = _beanProperties.find(propName);
if (prop != null) { // normal case
try {
prop.deserializeAndSet(p, ctxt, bean);
} catch (Exception e) {
wrapAndThrow(e, bean, propName, ctxt);
}
continue;
}
handleUnknownVanilla(p, ctxt, bean, propName);
} while ((propName = p.nextFieldName()) != null);