1

これは非常に簡単です。Java POJOをJSONとしてマーシャリングするために最低限必要な構造は何ですか?

オブジェクトにゲッター/セッターしかない場合、またはフィールド宣言が必須である場合、オブジェクトをJSONとしてマーシャリングできますか?

セッター/ゲッターの例:

class Circle{
 private float radius;
 private float pi;

 // setter and getters for those aboce;

 public float getArea(){
 // returns the computed area;
 }
}

では、「area」フィールドがFooクラスでフィールドとして定義されていない場合、そのようなオブジェクトをJSONとしてマーシャリングできますか?または、POJOのすべてのフィールドを明示的に宣言する必要がありますか?

4

3 に答える 3

1

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB 2(JSR-222)エキスパートグループのメンバーです。

サークル

MOXyの場合、ゲッターに対応するセッターがないため、必要な注釈@XmlElementはプロパティにあります。areaこれ@XmlElementは、JavaSE6以降に含まれています。

package forum10028037;

import javax.xml.bind.annotation.XmlElement;

class Circle{

    private float radius;
    private float pi;

    public float getRadius() {
        return radius;
    }

    public void setRadius(float radius) {
        this.radius = radius;
    }

    public float getPi() {
        return pi;
    }

    public void setPi(float pi) {
        this.pi = pi;
    }

    @XmlElement
    public float getArea(){
        return pi * radius * radius;
    }

}

デモ

package forum10028037;

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Circle.class);

        Circle circle = new Circle();
        circle.setPi(3.14f);
        circle.setRadius(10.1f);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("eclipselink.media-type", "application/json");
        marshaller.setProperty("eclipselink.json.include-root", false);
        marshaller.marshal(circle, System.out);
    }

}

出力

{
   "area" : 320.31143,
   "pi" : 3.14,
   "radius" : 10.1
}

詳細については

于 2012-04-05T15:23:47.000 に答える
1

これは実際にはマーシャリングエンジンに依存します。最近Springでjackson-mapperを使用していて、getter操作がない場合(getArea()の良い例)、インスタンスを正しくマーシャリングできませんでした。

仮に、標準のBeanセット/ゲット(またはあなたの場合はゲット)を持っているなら、それは問題ないはずです。

于 2012-04-05T11:53:46.653 に答える
1

Google Gsonライブラリを使用する場合、ゲッター/セッターは必要ありません。

ユーザーガイドの例:

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj);  
==> json is {"value1":1,"value2":"abc"}
于 2012-04-05T12:37:10.757 に答える