如何解决ObjectMapper 在映射到 JSON 时会忽略一些文件
所以我的问题是,当将一个类映射到 JSON 时,它不会映射该类具有的所有字段
卡片:
public class Card {
private String name;
private String description;
private StatusCard status;
private List<String> CardHistory;
public enum StatusCard{TODO,INPROGRESS,TOBEREVISED,DONE};
public Card(String name,String desc){
this.name = name;
description = desc;
status = StatusCard.TODO;
CardHistory = new ArrayList<>();
}
public Card(){}
// getters and setters
}
这个类在另一个类中使用,在一个
ArrayList<Card> cardList
,但是当我将这个类映射到 JSON 时,这是它映射的唯一字段
JSON:
... "cardList":[{"name":"test","status":"TODO"}] ...
我不知道为什么。这是服务器添加新卡的方法:
public String addCard(String projectName,String cardName,String desc,String nickUtente) {
if (projects.isEmpty())
return "No projects are currently present";
if (projectName.isEmpty() || cardName.isEmpty() || desc.isEmpty() || nickUtente.isEmpty())
return "Missing one or more arguments";
for (Project p : projects) {
if (p.getName().equalsIgnoreCase(projectName)){
if (!p.isMember(nickUtente))
return nickUtente + " does not belong to the project";
String code = p.addCard(cardName,desc);
if (code.equalsIgnoreCase("ok")) {
try {
om.writeValue(projectFile,projects);
} catch (IOException e) {
e.printStackTrace();
}
}
return code;
}
}
return "Project " + projectName + " not found";
}
如果您需要知道,这是使用 Project
类的 com.fasterxml.jackson
类:
public class Project implements Serializable {
private String name;
private String nickUtente;
private ArrayList<Card> cardList;
private ArrayList<String> users;
private ArrayList<String> TODO;
private ArrayList<String> INPROGRESS;
private ArrayList<String> TOBEREVISED;
private ArrayList<String> DONE;
private String MulticastAddress;
private int port;
/*
@JsonIgnore
private File projDir;
@JsonIgnore
private final ObjectMapper map;
*/
public Project(String name,String nickUtente,String multiaddr,int port) {
this.name = name;
this.nickUtente = nickUtente;
cardList = new ArrayList<>();
users = new ArrayList<>();
users.add(nickUtente);
TODO = new ArrayList<>();
INPROGRESS = new ArrayList<>();
TOBEREVISED = new ArrayList<>();
DONE = new ArrayList<>();
MulticastAddress = multiaddr;
this.port = port;
// map = new ObjectMapper();
// map.enable(SerializationFeature.INDENT_OUTPUT);
// projDir = new File("./BackupCards/" + name);
// if(!projDir.exists()) projDir.mkdir();
}
public Project(){
// this.map = new ObjectMapper();
// map.enable(SerializationFeature.INDENT_OUTPUT);
}
// getters and setters
public boolean isMember(String user){
if(users.isEmpty())
return false;
for(String s : users) {
if (user.equals(s))
return true;
}
return false;
}
public String addMember(String s) {
if (s.isEmpty()){
System.out.println("Missing name");
return "err";
}
if (users.contains(s)) {
System.out.println("Member exists already");
return "err";
}
users.add(s);
return "ok";
}
public String addCard(String cardName,String desc){
if(cardName.isEmpty() || desc.isEmpty())
return "Missing name and/or description";
Card c = new Card(cardName,desc);
cardList.add(c);
TODO.add(cardName);
/*
File cardFile = new File(projDir + "/" + cardName + ".json");
if (!cardFile.exists()) {
try {
cardFile.createNewFile();
} catch (IOException e) { e.printStackTrace(); }
}
//Backup card file
try {
map.writeValue(cardFile,c);
} catch (IOException e) {
e.printStackTrace();
}*/
return "ok";
}
public String moveCard(String cardName,String startingList,String destList){
if(cardName.isEmpty() || startingList.isEmpty() || destList.isEmpty())
return "Missing one or more arguments";
for(Card c : cardList){
if(c.getName().equalsIgnoreCase(cardName)){
switch(destList){
case "TODO":
if(startingList.equals("TODO"))
return "Card is already in " + startingList;
return "Cannot move card back to TODO";
case "INPROGRESS":
if(startingList.equals("INPROGRESS"))
return "Card already is in INPROGRESS";
if(startingList.equals("DONE"))
return "Card is done. Cannot change status anymore";
if(TODO.contains(cardName)){
TODO.remove(cardName);
INPROGRESS.add(cardName);
c.setStatus("INPROGRESS");
c.getCardHistory().add(startingList);
//System.out.println("Card moved from TODO to INPROGRESS");
return "ok";
}
if(TOBEREVISED.contains(cardName)){
TOBEREVISED.remove(cardName);
INPROGRESS.add(cardName);
c.setStatus("INPROGRESS");
c.getCardHistory().add(startingList);
//System.out.println("Card moved from TOBEREVISED to INPROGRESS");
return "ok";
}
return "Card not found";
case "TOBEREVISED":
if(!startingList.equals("INPROGRESS"))
return "Can only move to TOBEREVISED from INPROGRESS";
if(INPROGRESS.contains(cardName)){
INPROGRESS.remove(cardName);
TOBEREVISED.add(cardName);
c.setStatus("TOBEREVISED");
c.getCardHistory().add(startingList);
//System.out.println("Card moved FROM INPROGRESS TO TOBEREVISED");
return "ok";
}
case "DONE":
if(startingList.equals("TODO"))
return "Cannot move card to DONE from TODO";
if(INPROGRESS.contains(cardName)){
INPROGRESS.remove(cardName);
DONE.add(cardName);
c.getCardHistory().add(startingList);
c.setStatus("DONE");
//System.out.println("Moved card from INPROGRESS to DONE");
return "ok";
}
if(TOBEREVISED.contains(cardName)){
TOBEREVISED.remove(cardName);
DONE.add(cardName);
c.setStatus("DONE");
c.getCardHistory().add(startingList);
//System.out.println("Moved card from TOBEREVISED to DONE");
return "ok";
}
return "Card not found";
}
}
}
return "Card not found";
}
public void showMembers() {
if (users.isEmpty())
System.out.println("No user belongs to this project");
for (String s : users)
System.out.println(s);
}
public void showCards() {
if (TODO.isEmpty() && INPROGRESS.isEmpty() && TOBEREVISED.isEmpty() && DONE.isEmpty())
System.out.println("No cards to be shown");
if (TODO.isEmpty()) {
System.out.println("No cards TODO");
} else {
System.out.println("Cards TODO:");
for (String s : TODO)
System.out.println(s);
}
if (INPROGRESS.isEmpty()) {
System.out.println("No cards IN PROGRESS");
} else {
System.out.println("Cards INPROGRESS:");
for (String s : INPROGRESS)
System.out.println(s);
}
if (TOBEREVISED.isEmpty())
System.out.println("No cards TOBEREVISED");
else {
System.out.println("Cards TOBEREVISED:");
for (String s : TOBEREVISED)
System.out.println(s);
}
if (DONE.isEmpty())
System.out.println("No cards DONE");
else {
System.out.println("Cards DONE:");
for (String s : DONE)
System.out.println(s);
}
}
public Card getCard(String name) {
if (cardList.isEmpty())
return null;
for (Card c : cardList){
if (c.getName().equalsIgnoreCase(name))
return c;
}
return null;
}
public List<UserStatusInfo> getCardList() {
if(cardList.isEmpty())
return null;
List<UserStatusInfo> list = new ArrayList<>();
for(Card c : cardList)
list.add(new UserStatusInfo(c.getName(),c.getStatus()));
return list;
}
/* public void delProjDir(){
try {
Files.walk(projDir.toPath()).sorted(Comparator.reverseOrder()).map(Path::toFile)
.forEach(File::delete);
} catch (IOException e) {
e.printStackTrace();
}
}
*/
}
解决方法
问题来了
public List<UserStatusInfo> getCardList() {
if(cardList.isEmpty())
return null;
List<UserStatusInfo> list = new ArrayList<>();
for(Card c : cardList)
list.add(new UserStatusInfo(c.getName(),c.getStatus()));
return list;
}
您拥有私有属性 ArrayList<Card> cardList
和公共方法 List<UserStatusInfo> getCardList()
。由于 ObjectMapper 在序列化过程中遵循 JavaBean 约定,它只访问公共属性和公共 getter 方法,因此当 cardList
映射到 JSON 时,实际上序列化的不是 cardList
属性,而是 getCardList()
方法调用的结果因此不是 Card
实例被序列化,而是 UserStatusInfo
实例(似乎只有 name
和 status
)。
您必须创建返回 ArrayList<Card> getCardList()
属性的 cardList
方法,并将当前的 List<UserStatusInfo> getCardList()
重命名为其他内容
或
扩展 UserStatusInfo
类,使其具有 Card
中的所有相应属性
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。