使用Spring映射嵌套的json和POJO

时间:2014-03-06 00:05:03

标签: java json spring pojo

我正在实现一个REST API,它使用json发送和接收数据(我对这个API设计是全新的)。我使用Spring框架和requestbody / responsebody进行映射。 最初,我有一个这样的pojo:

public class Action implements Serializable {

    @Id
    private String id;
    private String name;
    private String applicationId;
    private String timeStamp;
    private String username;
    private String options;
    //Getters and Setters
}

这个pojo的json格式是这样的:

{
 "id": "11954cd5-eec3-4f68-b0e8-a4d9b6a976a9",
 "name": "kill button",
 "applicationId": "34fa7bbf-e49f-4f2a-933a-de26b9fdb0f1",
 "timeStamp": "2014-03-05T11:51+0000",
 "username": "user1783",
 "options": "facebook app" 
}

这就是控制器的样子:我没有得到任何json,Spring已经转换为java对象,是否应该自己手动执行?

@RequestMapping(value = "applications/{appId}/actions", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
public Action addAction(@PathVariable String appId, @RequestBody Action action) {
    return actionService.add(appId, action);
}

你可以在这里找到一个漂亮的json格式: https://gist.github.com/bakharzy/8948950

我想将json中的最后一对更改为json本身,因为它在gist中以第二种json格式显示。因此用户可以发送更多信息。现在我有一个json的新格式,这是json中的一种json,我应该如何更改pojo(私有String options;)来存储来自第二种json格式的数据。注意,内部json可以具有任意数量的对。

我的第一个想法是将pojo中的选项更改为Hash对象。它可行吗?如果是这样,怎么样?

由于

2 个答案:

答案 0 :(得分:5)

只需使用嵌套的对象:

public class Action implements Serializable {

    @Id
    private String id;
    private String name;
    private String applicationId;
    private String timeStamp;
    private String username;
    private Map<String, String> options;
    //Getters and Setters
}

这将为您提供以下格式:

{
    "id": "11954cd5-eec3-4f68-b0e8-a4d9b6a976a9",
    "name": "kill button",
    "applicationId": "34fa7bbf-e49f-4f2a-933a-de26b9fdb0f1",
    "timeStamp": "2014-03-05T11:51+0000",
    "username": "user1783",
    "options":{
          "data": "Click Here",
          "size": "36",
          "application":"facebook app"
     }
}

更新: - 添加测试以证明解决方案确实有效。

public class ActionTest {

        @Test
        public void testObjectToJson() throws JsonProcessingException {

            Action action = new Action();
            action.setId("id");
            action.setUsername("username");
            action.setApplicationId("applicationId");
            action.setName("name");
            action.setTimeStamp("timestamp");
            Map<String, String> map = Maps.newHashMap();
            map.put("key", "value");
            map.put("key2", "value2");
            action.setOptions(map);

            ObjectMapper mapper = new ObjectMapper();

            String value = mapper.writeValueAsString(action);
            System.out.println(value);
        }

        @Test
        public void testJsonToObject() throws IOException {

            String json = "{\"id\":\"id\",\"name\":\"name\",\"applicationId\":\"applicationId\",\"timeStamp\":\"timestamp\",\"username\":\"username\",\"options\":{\"key\":\"value\", \"key2\":\"value2\"}}";

            ObjectMapper mapper = new ObjectMapper();

            Action value = mapper.readValue(json, Action.class);
            System.out.println(value);
        }
    }

    class Action {

        private String id;
        private String name;
        private String applicationId;
        private String timeStamp;
        private String username;
        private Map<String, String> options;

        public Action() {}

        @Override
        public String toString() {
            final StringBuffer sb = new StringBuffer("Action{");
            sb.append("id='").append(id).append('\'');
            sb.append(", name='").append(name).append('\'');
            sb.append(", applicationId='").append(applicationId).append('\'');
            sb.append(", timeStamp='").append(timeStamp).append('\'');
            sb.append(", username='").append(username).append('\'');
            sb.append(", options=").append(options);
            sb.append('}');
            return sb.toString();
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getApplicationId() {
            return applicationId;
        }

        public void setApplicationId(String applicationId) {
            this.applicationId = applicationId;
        }

        public String getTimeStamp() {
            return timeStamp;
        }

        public void setTimeStamp(String timeStamp) {
            this.timeStamp = timeStamp;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public Map<String, String> getOptions() {
            return options;
        }

        public void setOptions(Map<String, String> options) {
            this.options = options;
        }
    }

答案 1 :(得分:-1)

Map<String, Object> innerMap = new WhateverMap<String, Object>();
innerMap.put("data", "click here");
innerMap.put("size", "36");
innerMap.put("application", "facebook app");

Map<String, Object> outerMap = new WhateverMap<String, Object>();
outerMap.put("name", "kill button");
outerMap.put("username", "user1783");
outerMap.put("options", innerMap);

String jsonString = jsonEncoder.encode(outerMap);