我使用Spring value
将JSON有效负载映射到Java对象。不幸的是,这个JSON有效负载不使用set约定,而是使用同时使用camelCase和snake_case的名称。
要明确我的@RequestBody
看起来像这样:
Controller
@RequestMapping(value="/mobile/device", method = RequestMethod.PUT)
public ResponseEntity<Object> flagDevice (@RequestBody List<MobileDeviceData> deviceInfoList) {
... code here ...
}
MobileDeviceData
对象有几个setter方法,如:
Entity
当JSON对象名称为camelCase时,这非常有用且无需任何额外工作。但是对于snake_case名称,我需要添加public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public void setFlagId(int flagId) {
this.flagId = flagId;
}
:
Annotation
为了获取它。
我知道如果可以避免使用@JsonProperty("flag_id")
private int flagId;
并不是一个好主意,因为您需要注释每个参数。我的问题是,是否有更通用的方法来强制匹配snake_case与@JsonProperty
对象中相应的camelCase?显然要做到这一点,而不是搞砸已经是camelCase的那些。
答案 0 :(得分:0)
根据article here,有一种简单的方法可以反序列化MobileDeviceData
类。以下是示例代码:
@JsonDeserialize(using = UserDeserializer.class)
public class User {
private ObjectId id;
private String username;
private String password;
public User(ObjectId id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public ObjectId getId() { return id; }
public String getUsername() { return username; }
public String getPassword() { return password; }
}
假设User是我们有兴趣编写Deserializer的类。这里没有多少值得注意,除了告诉杰克逊知道如何deserialize
这个班级的注释。
public class UserDeserializer extends JsonDeserializer {
@Override
public User deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
return new User(null,
node.get("username").getTextValue(),
node.get("password").getTextValue());
}
}
通过扩展Jackson的抽象JsonDeserializer
类,并将其赋予deserialize
所需的类型来创建反序列化器。很难确定您可以使用field name
JsonParser
ObjectCodec
引用JSON {/ p>}。
我希望它有所帮助。 如果需要,请随时发表评论!
答案 1 :(得分:0)
我已经开始研究这一点了,我现在意识到做任何事情都会产生类似的效果。
当您收到(反序列化)JSON对象时,通常希望您使用相同的参数传递(序列化)。如果实现以相同的方式提取camelCase和下划线参数,那么它将不知道如何在以后正确地反序列化。通过遵循标准约定,然后对所有异常使用@JsonProperty
,仍然可以反序列化并稍后交付JSON对象,就像收到它一样。