2017-02-17 122 views
1

我是Spring框架的新手,尝试构建RESTful Web服务。现在我有点卡住了这个问题。JSON与Spring的嵌套集合对象

我有一些实体类一样的UserDetails(getter/setter方法,equals()和hashCode()方法略):

public class UserDetails { 

    private Long userId; 
    private String login; 
    private String firstName; 
    private String lastName; 

    private Map<ActionDetails, Boolean> confirmedActionsMap; 
} 

和ActionDetails(再次getter/setter方法,equals()和hashCode()方法略) :

public class ActionDetails { 

    private Long actionId; 
    private String actionName; 
    private String actionDescription; 
} 

我在@RestController返回的UserDetails的方法:

@GET 
@RequestMapping("/user") 
@Produces ({ "application/json" }) 
public ResponseEntity<User> getUser(){ 

    UserDetails userDetails = //obtaining user somehow 

    return new ResponseEntity<User>(userDetails, HttpStatus.OK); 
} 

但作为回应,我得到JSON在地图ActionDetails不序列化JSON,但简称的toString()就可以了:

{ 
    "userId": 1, 
    "login": "j.doe", 
    "firstname": "John", 
    "lastname": "Doe", 
    "confirmedActionsMap": {"[email protected]": true} 
} 

ActionDetails自己与否有关其他控制器方法返回的是序列化到JSON就好了。 什么是最适合序列化REST中的集合中的对象的方法?

+0

它调用ActionDetails.toString(),因为在这种情况下它是地图的关键。 –

+0

我建议创建两种类型的列表confirmedActionsList和NotConfirmedActionsList并省略布尔值。 –

回答

1

A Mapkey,value对的表示。在密钥上调用toString()是表示密钥的唯一合理方式。

如果你想序列化ActionDetail不同,我建议在另一个类包装ActionDetailBoolean并把在一个List

例如:

public class UserDetails { 
    private Long userId; 
    private String login; 
    private String firstName; 
    private String lastName; 
    private List<ActionDetailWrapper> confirmedActions; 
} 

public class ActionDetails { 
    private Long actionId; 
    private String actionName; 
    private String actionDescription; 
} 

public class ActionDetailWrapper { 
    private ActionDetails actionDetails; 
    private Boolean result; 
} 

另外,您可以键入您的Map使用actionIdActionDetails并添加BooleanActionDetails类。