java - 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
属性的方法,并将 current 重命名List<UserStatusInfo> getCardList()
为其他名称
或者
扩展UserStatusInfo
类,使其具有所有相应的属性Card
推荐阅读
- longhorn - 如何为 Longhorn 的卷配置磁盘
- conv-neural-network - keras Conv2D 模型在去模糊图像时给出错误的结果
- scala - 将数据框转换为在 scala 中映射的有效方法
- javascript - 什么是 InstantSearchSDKJSBridgeClearHighlight?
- python - 无法使用 python 将元组导出到 csv/文本文件
- python - 为什么变量赋值比从 python 中的数组调用更快?
- python - 拆分数据框中的列表,在列和行中具有不同长度的列表
- javascript - 是否可以使用破折号引导程序单击 dbc.progress 栏以重定向到另一个页面
- python - 使用 Pyautogui 在 Tkinter 中循环
- javascript - Express Docker 容器在本地工作但未部署