如何创建自定义Jackson Mapper?

时间:2014-04-21 20:01:00

标签: java json spring serialization jackson

我想用杰克逊为谷歌图表构建一个DataTable,我可以轻松创建一个json文件..

我使用这个杰克逊版本:

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.2.3</version>
</dependency>

我有以下类(该示例目前只创建行):

 public class DataTable implements Serializable {

    private static final long serialVersionUID = 1L;

    @JsonProperty("rows")   
    private List<DataTableRow> dataTableRows;


    public List<DataTableRow> getDataTableRows() {      
       return dataTableRows;    
    }

    public void setDataTableRows(List<DataTableRow> dataTableRows) {
        this.dataTableRows = dataTableRows;     
    }   

 }

然后我有一个DataTableRow类

public class DataTableRow implements Serializable{

    private static final long serialVersionUID = 1L;    

    @JsonProperty("c")  
    List<SingleTableCell> singleTableCell;

    public List<SingleTableCell> getSingleTableCell() {         
        return singleTableCell;     
    }

    public void setSingleTableCell(List<SingleTableCell> singleTableCell) {         
        this.singleTableCell = singleTableCell;     
    }   

}

并且一行有几个SingleTableCells

public class SingleTableCell implements Serializable{

    private static final long serialVersionUID = 1L;    

    @JsonProperty("v")  
    private Value value;

    @JsonProperty("f")  
    private String formattedValue = null;


    public Value getValue() {       
        return value;   
    }


    public void setValue(Value value) {         
        this.value = value;     
    }


    public String getFormattedValue() {         
        return formattedValue;  
    }


    public void setFormattedValue(String formattedValue) {
        this.formattedValue = formattedValue;   
   }

}

这会生成一个像这样的Json字符串:

{

"rows": [
    {
        "c": [
            {
                "v": {
                    "value": "Hans"
                },
                "f": null
            },
            {
                "v": {
                    "value": 3.4
                },
                "f": null
            }
        ]
    }
]

}

问题是我的Value对象这是一个抽象类我不希望这个类呈现为json对象我只想要一个键值对!所以它不应该渲染到这个:

“v”:{            “价值”:“汉斯”        }

我只想要这个:“v”:“汉斯”

我希望我可以定义Value对象如何呈现值对象,例如String,Double或Date Object ...如果它是Date对象,则Date应该转换为String,如下所示: v“:日期(2010,10,01)

如果它是像String或Double这样的其他对象,我想决定json字符串的样子......

我的抽象类看起来像这样:

public abstract class Value { 

}

public class StringValue extends Value{

    String Value;
}



public class DoubleValue extends Value{

    Double Value; 
}


public class DateValue extends Value{

    Date Value;
}

1 个答案:

答案 0 :(得分:1)

我会对您的代码进行以下更改,以实现您的目标:

public abstract class Value { 

}

public class StringValue extends Value{

    @JsonValue
    //do whatever else you need although I can't really see what that would be
    String Value;
}



public class DoubleValue extends Value{

    @JsonValue
    //do whatever else you need although I can't really see what that would be
    Double Value; 
}


public class DateValue extends Value{

    @JsonValue
    @DateFormat() //insert the relevant date code here
    Date Value;

}

从您发布的代码中我无法真正看到类Value的目的是什么,但我在这里跑了,因为我猜你用它做的比你发布的更多