使用Spring @RequestBody将JSON与有效负载中的混合约定转换为实体对象

时间:2015-11-17 16:58:43

标签: java json spring spring-mvc spring-data

我使用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的那些。

2 个答案:

答案 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对象,就像收到它一样。