我有以下问题。我正在使用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"}
任何想法如何覆盖这个?
答案 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"}]
如果可能的话,我会阻止使用大写的属性名称,因为它违反了一般的代码约定。