使用@JsonSomething别名

时间:2019-04-02 14:57:43

标签: java jackson

我们有:

  • 带有names_all_lowercase_with_underscores的一堆JSON变量
  • 必须的Java对象具有usualCamelCaseNames,这是由于Sonar检查器非常严格(我们无法更改其规则)。

使事情变得简单:

  • 我正在尝试在使用V​​1(codehaus)和V2(fasterxml)版本的代码中保持理智(尝试仅保留V2)。
  • 由于几个WS调用具有相同的外部控制结构但具有不同的“有效负载”,因此外部结构是通用类:

    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; }

在JSON(*)中设置controlXXXAttr。不幸的是,由于上述声纳检查,这是我无法使用的解决方案。

我想念什么吗?

(*),因为这也是非通用属性的问题,所以我认为通用类在这里无关紧要。

2 个答案:

答案 0 :(得分:0)

尝试使用类似的东西

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       
 }

答案 1 :(得分:0)

如果我正确理解了您的问题,则可以考虑使用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);