我们有:
names_all_lowercase_with_underscores
的一堆JSON变量usualCamelCaseNames
,这是由于Sonar检查器非常严格(我们无法更改其规则)。使事情变得简单:
由于几个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
。不幸的是,由于上述声纳检查,这是我无法使用的解决方案。
我想念什么吗?
(*),因为这也是非通用属性的问题,所以我认为通用类在这里无关紧要。
答案 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);