2012-12-18 20 views
1

我遇到以下問題。我正在用Hibernate模板讀取我的MySQL數據庫中的記錄列表,然後我需要修改結構,所以我是JSONObject和JSONArray(使用我猜官方庫:http://www.json.org/java/)。如果我使用列表作爲服務器響應,記錄字段將被正確命名(由於使用了@JsonProperty註釋)。但是,如果我試圖從這個List元素中創建一個JSONObject,那麼我得到的所有字段都以小寫字母開頭,這打破了我的UI。以JSONObject的形式讀取對象屬性lowercased

這是用我的「任務」的模式:

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

你想做什麼? –

+0

我想要得到這樣的JSON:{「Id」:18,「Name」:「Release」}。我不能使用列表,因爲它是平坦的,我需要一棵樹,這就是爲什麼我使用JSON結構來實現這一點。 –

+0

你爲什麼要返回一個JSONArray - 它既不是最終的字符串輸出,也不提供POJO的類型安全性?你知道'ObjectMapper'類嗎? – Dunes

回答

1

你的類overannotated,並打破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"}] 

我會鼓勵儘可能使用大寫的屬性名因爲它違背了通用代碼約定。

+0

不幸的是,前面有一個應用程序無法重寫,需要嚴格格式化這些數據。 –

1

JSON.org API旨在用於非常簡單的序列化/反序列化,它不能做你想要的。話雖如此,你的大部分註釋實際上來自傑克遜,其中可以做你想做的事情。

您已經有了正確註釋爲傑克遜POJO的,所以返回一個JSON字符串符合他們,序列化使用ObjectMapper

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