1

次の問題があります。Hibernateテンプレートを使用してMySQLデータベースからレコードのリストを読み取っています。次に、構造を変更して、JSONObjectとJSONArrayになるようにする必要があります(公式ライブラリを使用すると:http ://www.json.org/java /)。サーバー応答としてリストを使用している場合、レコードフィールドには適切な名前が付けられます(@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"}

これをオーバーライドする方法はありますか?

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 に答える