1

我有以下问题。我正在使用 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;
    }
}

这是用于从数据库中获取记录的代码(去掉了所有不必要的部分):

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"}

任何想法如何覆盖它?

4

2 回答 2

1

JSON.org API 旨在用于非常简单的序列化/反序列化,它不能满足您的需求。话虽如此,您的大部分注释实际上来自杰克逊,它可以完成您想要完成的工作。

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

final List<Task> list = getEvents();
final ObjectMapper mapper = new ObjectMapper();
final String json = mapper.writeValueAsString(list);
于 2012-12-18T12:41:20.110 回答
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"}]

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

于 2012-12-18T12:49:45.550 回答