Это может быть дубликат. Но я не могу найти решение своей проблемы.
У меня есть класс
public class MyResponse implements Serializable {
private boolean isSuccess;
public boolean isSuccess() {
return isSuccess;
}
public void setSuccess(boolean isSuccess) {
this.isSuccess = isSuccess;
}
}
Геттеры и сеттеры генерируются Eclipse.
В другом классе я устанавливаю значение true и записываю его как строку JSON.
System.out.println(new ObjectMapper().writeValueAsString(myResponse));
В JSON ключ выглядит как {"success": true}
.
Я хочу, чтобы ключ был isSuccess
сам по себе. Использует ли Джексон метод установки при сериализации? Как сделать ключ именем самого поля?
isSuccess
это,isIsSuccess
я думаю, имя вашего метода должно быть таким,SetSuccess
как он генерируется Eclipse. (По стандарту)Ответы:
Это немного запоздалый ответ, но он может быть полезен всем, кто заходит на эту страницу.
Простым решением для изменения имени, которое Джексон будет использовать при сериализации в JSON, является использование аннотации @JsonProperty , поэтому ваш пример будет выглядеть следующим образом:
public class MyResponse implements Serializable { private boolean isSuccess; @JsonProperty(value="isSuccess") public boolean isSuccess() { return isSuccess; } public void setSuccess(boolean isSuccess) { this.isSuccess = isSuccess; } }
Затем он будет сериализован в JSON as
{"isSuccess":true}
, но имеет то преимущество, что вам не нужно изменять имя вашего метода получения.Обратите внимание, что в этом случае вы также можете написать аннотацию,
@JsonProperty("isSuccess")
поскольку она имеет только одинvalue
элементисточник
Недавно я столкнулся с этой проблемой, и вот что я нашел. Джексон проверит любой передаваемый ему класс на предмет геттеров и сеттеров и будет использовать эти методы для сериализации и десериализации. То, что следует за «get», «is» и «set» в этих методах, будет использоваться в качестве ключа для поля JSON («isValid» для getIsValid и setIsValid).
public class JacksonExample { private boolean isValid = false; public boolean getIsValid() { return isValid; } public void setIsValid(boolean isValid) { this.isValid = isValid; } }
Точно так же isSuccess станет «success», если не будет переименовано в isIsSuccess или getIsSuccess.
Подробнее здесь: http://www.citrine.io/blog/2015/5/20/jackson-json-processor
источник
Используя обе аннотации ниже, вынуждает включать в выходной JSON
is_xxx
:@get:JsonProperty("is_something") @param:JsonProperty("is_something")
источник
Вы можете настроить
ObjectMapper
следующее:mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() { @Override public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { if(method.hasReturnType() && (method.getRawReturnType() == Boolean.class || method.getRawReturnType() == boolean.class) && method.getName().startsWith("is")) { return method.getName(); } return super.nameForGetterMethod(config, method, defaultName); } });
источник
Когда вы используете Kotlin и классы данных:
data class Dto( @get:JsonProperty("isSuccess") val isSuccess: Boolean )
Возможно, вам придется добавить,
@param:JsonProperty("isSuccess")
если вы также собираетесь десериализовать JSON.источник
Основываясь на ответе Уткарша ..
Имена получателей минус get / используются в качестве имени JSON.
public class Example{ private String radcliffe; public getHarryPotter(){ return radcliffe; } }
хранится как {"harryPotter": "somethingYouGaveHere"}
Для десериализации Джексон проверяет как установщик, так и имя поля. Для строки Json {"word1": "example"} допустимы оба приведенных ниже значения.
public class Example{ private String word1; public setword2( String pqr){ this.word1 = pqr; } } public class Example2{ private String word2; public setWord1(String pqr){ this.word2 = pqr ; } }
Более интересный вопрос - какой порядок Джексон рассматривает для десериализации. Если я попытаюсь десериализовать {"word1": "myName"} с помощью
public class Example3{ private String word1; private String word2; public setWord1( String parameter){ this.word2 = parameter ; } }
Я не проверял приведенный выше случай, но было бы интересно увидеть значения word1 и word2 ...
Примечание: я использовал совершенно разные имена, чтобы подчеркнуть, какие поля должны быть одинаковыми.
источник
есть другой способ решения этой проблемы.
просто определите новый подкласс extends PropertyNamingStrategy и передайте его экземпляру ObjectMapper.
вот фрагмент кода может помочь больше:
mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() { @Override public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { String input = defaultName; if(method.getName().startsWith("is")){ input = method.getName(); } //copy from LowerCaseWithUnderscoresStrategy if (input == null) return input; // garbage in, garbage out int length = input.length(); StringBuilder result = new StringBuilder(length * 2); int resultLength = 0; boolean wasPrevTranslated = false; for (int i = 0; i < length; i++) { char c = input.charAt(i); if (i > 0 || c != '_') // skip first starting underscore { if (Character.isUpperCase(c)) { if (!wasPrevTranslated && resultLength > 0 && result.charAt(resultLength - 1) != '_') { result.append('_'); resultLength++; } c = Character.toLowerCase(c); wasPrevTranslated = true; } else { wasPrevTranslated = false; } result.append(c); resultLength++; } } return resultLength > 0 ? result.toString() : input; } });
источник
Я не хотел возиться с некоторыми индивидуальными стратегиями именования или воссоздавать некоторые средства доступа.
Чем меньше кода, тем я счастливее.
Это помогло нам:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties({"success", "deleted"}) // <- Prevents serialization duplicates public class MyResponse { private String id; private @JsonProperty("isSuccess") boolean isSuccess; // <- Forces field name private @JsonProperty("isDeleted") boolean isDeleted; }
источник
Принятый ответ не сработает в моем случае.
В моем случае класс не принадлежит мне. Проблемный класс исходит из сторонних зависимостей, поэтому я не могу просто добавить
@JsonProperty
в него аннотацию.Чтобы решить эту проблему, вдохновившись ответом @burak выше, я создал следующий обычай
PropertyNamingStrategy
:mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() { @Override public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { if (method.getParameterCount() == 1 && (method.getRawParameterType(0) == Boolean.class || method.getRawParameterType(0) == boolean.class) && method.getName().startsWith("set")) { Class<?> containingClass = method.getDeclaringClass(); String potentialFieldName = "is" + method.getName().substring(3); try { containingClass.getDeclaredField(potentialFieldName); return potentialFieldName; } catch (NoSuchFieldException e) { // do nothing and fall through } } return super.nameForSetterMethod(config, method, defaultName); } @Override public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) { if(method.hasReturnType() && (method.getRawReturnType() == Boolean.class || method.getRawReturnType() == boolean.class) && method.getName().startsWith("is")) { Class<?> containingClass = method.getDeclaringClass(); String potentialFieldName = method.getName(); try { containingClass.getDeclaredField(potentialFieldName); return potentialFieldName; } catch (NoSuchFieldException e) { // do nothing and fall through } } return super.nameForGetterMethod(config, method, defaultName); } });
В основном, это то, что перед сериализацией и десериализацией он проверяет в целевом / исходном классе, какое имя свойства присутствует в классе, будь то свойство
isEnabled
илиenabled
свойство.Исходя из этого, преобразователь будет сериализовать и десериализовать существующее имя свойства.
источник
Вы можете изменить примитивное логическое значение на java.lang.Boolean (+ использовать
@JsonPropery
)@JsonProperty("isA") private Boolean isA = false; public Boolean getA() { return this.isA; } public void setA(Boolean a) { this.isA = a; }
У меня отлично сработало.
источник