Использование @JsonSomething для псевдонимов - PullRequest
0 голосов
/ 02 апреля 2019

У нас есть:

  • набор переменных JSON с names_all_lowercase_with_underscores
  • Java-объектами, которые должны иметь usualCamelCaseNames из-за оченьЖесткий Sonar Checker (на котором мы не можем изменить правила).

Чтобы упростить ситуацию:

  • Я пытаюсь придать здравый смысл в коде, который используетверсии V1 (codehaus) и V2 (fastxml) (пытается сохранить только V2).
  • Поскольку несколько вызовов WS имеют одинаковую структуру внешнего управления, но разные «полезные нагрузки», внешняя структура является универсальнойclass:

    class Data<Payload> {
        private control_attr;
        private Payload pay_load;
    }
    

В идеале, для каждого атрибута должен быть @JsonAlias ​​("json_name"), который будет использоваться для сериализации / десериализации.

  class Data<Payload> {
        @JsonAlias("control_attr")
        private String controlAttr;
        @JsonAlias("pay_load")
        private Payload payLoad;
    }

Но, к сожалению, @JsonAlias работает не так. Я пытался поставить @JsonProperty на атрибуты (без результата) и даже

 @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

Но все, что я пробую, единственноечто, кажется, считается фактическим получателем:

    @JsonGetter("control_attr")
    public String getControlXXXAttr { return controlAttr; }

устанавливает controlXXXAttr в JSON (*). И, к сожалению,y это решение, которое я не могу использовать из-за упомянутых выше проверок сонара.

Я что-то упустил?

(*), поскольку это также проблема с неуниверсальным атрибутом, яПредположим, что универсальный класс здесь не имеет значения.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

Если я правильно понимаю вашу проблему, вы можете рассмотреть PropertyNamingStrategy:

mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

Рассмотрим, например, следующий класс:

@Data
public class Example {

    private String fooBar = "hey";
    private String fizBiz = "hey";
}

При сериализации в JSON:

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
String json = mapper.writeValueAsString(new Example());

У вас будет следующее:

{"foo_bar":"hey","fiz_biz":"hey"}

Десерилизация также будет работать:

Example example = mapper.readValue(json, Example.class);
0 голосов
/ 02 апреля 2019

Попробуйте использовать что-то вроде

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonIgnoreProperties(ignoreUnknown = true)
class Data<Payload> {

@JsonProperty("control_attr", required = true)
private String controlAttr;
@JsonProperty("pay_load", required = true)
private Payload payLoad;

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