有关json格式的问题是由spring restful返回的吗?

时间:2016-11-08 08:10:59

标签: json spring rest spring-mvc spring-rest

CGSize(width:150, height:150)

我在下面的restful控制器中写了一个方法。

Class EntityDataSet {
      public List<EntityRow> getData() {
        return rowList;     
}

class EntityRow {
      private Map<String, Object> rowData;

      public Map<String, Object> getRowData() {
        return rowData;
    }
}

返回的json如下所示。

@RequestMapping(value = "/entityData", method = RequestMethod.POST, headers = "Accept=application/json")
public EntityDataSet getEntityData(@RequestBody QueryObject query) throws Exception{
    return entityManager.generateEntityDataByName(query);
}

但我想得到的就像下面一样。

{
    "data": [
        {
            "rowData": {
                "FISCAL_YEAR_END": null,
                "HOME_COUNTRY": null
            }
        },
        {
            "rowData": {
                "FISCAL_YEAR_END": null,
                "HOME_COUNTRY": "10"
            }
        },
        ..................

我该如何实施?感谢。

1 个答案:

答案 0 :(得分:1)

可以使用EntityRow类中的@JsonAnySetter@JsonAnyGetter注释完成(如果使用Jackson):

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.annotation.JsonProperty;

public class EntityDataSet {

    @JsonProperty("data")
    private List<EntityRow> rowList;

    /**
     * @return the rowList
     */
    public List<EntityRow> getRowList() {
        return rowList;
    }

    /**
     * @param rowList the rowList to set
     */
    public void setRowList(List<EntityRow> rowList) {
        this.rowList = rowList;
    }

    /**
     * 
     * @param row
     */
    public void add(EntityRow row){
        if(this.rowList == null){
            this.rowList = new ArrayList<EntityRow>();
        }
        this.rowList.add(row);
    }
}

这是关键类,带有@JsonAnySetter和@JsonAnyGetter注释的EntityRow

import java.util.Map;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;


public class EntityRow {

    private Map<String, Object> rowData;

    /**
     * @param rowData the rowData to set
     */
    @JsonAnySetter
    public void setRowData(Map<String, Object> rowData) {
        this.rowData = rowData;
    }

    @JsonAnyGetter
    public Map<String, Object> getRowData() {
        return rowData;
    }
}

测试它的主要内容:

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test4 {

    public static String getJsonString(Object o){
        ObjectMapper mapper = new ObjectMapper();

        //For testing
        try {
            //Convert object to JSON string
            String jsonInString = mapper.writeValueAsString(o);
            //System.out.println(jsonInString);
            return jsonInString;


        } catch (JsonProcessingException e){
            e.printStackTrace();
        } 
        return null;
    }

    public static void main(String args[]){

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("FISCAL_YEAR_END", null);
        map.put("HOME_COUNTRY", null);

        Map<String, Object> map2 = new HashMap<String, Object>();
        map2.put("FISCAL_YEAR_END", null);
        map2.put("HOME_COUNTRY", "10");

        EntityRow row1 = new EntityRow();
        row1.setRowData(map);

        EntityRow row2 = new EntityRow();
        row2.setRowData(map2);

        EntityDataSet entityDataSet = new EntityDataSet();
        entityDataSet.add(row1);
        entityDataSet.add(row2);

        System.out.println(Test4.getJsonString(entityDataSet));
    }
}

最后,这是输出:

    {"data":
           [
             {
                 "FISCAL_YEAR_END":null,
                 "HOME_COUNTRY":null
             },
             {
                 "FISCAL_YEAR_END":null,
                 "HOME_COUNTRY":"10"
             }
           ]
    }