读取为JSONObject时,对象属性小写

时间:2012-12-18 11:03:36

标签: java json hibernate

我有以下问题。我正在使用Hibernate模板从我的MySQL数据库中读取记录列表,然后我需要修改结构,所以我是JSONObject和JSONArray(使用我猜官方库:http://www.json.org/java/)。如果我使用List作为服务器响应,则记录字段被正确命名(由于使用了@JsonProperty注释)。但是如果我试图用这个List元素创建一个JSONObject,那么我的所有字段都以小写字母开头,这会打破我的UI。

这是我使用的'任务'模型:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;

@JsonAutoDetect
@JsonIgnoreProperties(ignoreUnknown = true)
@Entity
@Table(name="tasks")
public class Task {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private int Id;

    @Column(name="Name", nullable=false)
    private String Name;


    @JsonProperty("Id")
    public int getId() {
        return Id;
    }

    @JsonProperty("Id")
    public void setId(int id) {
        this.Id = id;
    }

    @JsonProperty("Name")
    public String getName() {
        return Name;
    }

    @JsonProperty("Name")
    public void setName(String name) {
        this.Name = name;
    }
}

这里是用于从DB获取记录的代码(去除了所有不必要的部分):

public List<Task> getEvents() {

    DetachedCriteria criteria = DetachedCriteria.forClass(Task.class);

    return hibernateTemplate.findByCriteria(criteria);
}    

private static JSONArray read() throws JSONException{
    List<Task> list = getEvents();
    Iterator<Task> listIterator = list.iterator();
    JSONArray ret = new JSONArray();
    String parentId;

    while(listIterator.hasNext()){
        Task task = listIterator.next();
        JSONObject taskJSON = new JSONObject(task);
        ret.put(taskJSON);
    }
}

正如您在我的服务器响应中所看到的,所有字段名称都以小写字母开头: {"id":18,"name":"Release"}

任何想法如何覆盖这个?

2 个答案:

答案 0 :(得分:1)

JSON.org API用于非常简单的序列化/反序列化,它无法满足您的需求。话虽如此,你的大多数注释实际上来自杰克逊, 可以 做你想要完成的事情。

您已经为Jackson正确注释了POJO,因此返回符合它们的JSON字符串,使用ObjectMapper序列化:

final List<Task> list = getEvents();
final ObjectMapper mapper = new ObjectMapper();
final String json = mapper.writeValueAsString(list);

答案 1 :(得分:1)

您的类被过度注释,并且违反了Java代码约定。

所需的最低要求如下。您添加的所有其他内容都是默认完成的。

@Entity
@Table(name="tasks")
public class Task {

    @Id
    @GeneratedValue
    @Column(name="Id")
    @JsonProperty("Id")
    private int id;


    @Column(name="Name", nullable=false)
    @JsonProperty("Name")
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

要序列化您的课程,您需要的是ObjectMapper课程

String json = new ObjectMapper().writeValueAsString(getEvents());

其输出应如下所示:

[{"Id":18,"Name":"Build"}, {"Id":19,"Name":"Release"}]

如果可能的话,我会阻止使用大写的属性名称,因为它违反了一般的代码约定。