1

这很简单。将 Java POJO 编组为 JSON 所需的最低结构是什么?

如果一个对象只有 getter/setter 或者字段声明是强制性的,你能将它编组为 JSON 吗?

设置器/获取器示例:

class Circle{
 private float radius;
 private float pi;

 // setter and getters for those aboce;

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

那么如果 Foo 类中没有将“area”字段定义为字段,那么这样的对象是否可以编组为 JSON?或者是否必须明确声明 POJO 中的所有字段?

4

3 回答 3

1

如果您使用Google Gson库,则不需要 getter/setter:

用户指南中的示例:

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 回答
1

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB 2 (JSR-222)专家组的成员。

圆圈

对于 MOXy,唯一需要的注释将@XmlElementarea属性上,因为没有对应于 getter 的 setter。包含在@XmlElementJava SE 6 及更高版本中:

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 回答