避免代表JSON的Pojos的样板代码



我正在创建一个通常采用JSON格式的许多不同NetworkMessages的库,现在需要相应的Java模型。

问题是,这些消息很容易在JSON中拥有大约100个字段。其中一些是强制性(30%),其中一些是可选(70%)

因此,我拥有的最大关注点是如何最大程度地减少相应模型中的锅炉板码。因为,就像我说的那样,这些波约斯很容易拥有大约100个领域,并且有许多构建器中的许多领域。

我将举一个小Message的示例,但请记住,这些消息通常更大(更多字段)。

Messagea.java

@JsonInclude(Include.NON_EMPTY)
public class MessageA extends NetworkMessage {
    private final String a;
    private final String b;
    private final String c;
    private final String d;
    private final String e;
    private final String f;
    private final String g;
    private final String h;
    private final String i;
    private final String j;
    private final String k;
    @JsonCreator
    private MessageA(
            // required fields
            @JsonProperty(value = "a", required = true) String a, 
            @JsonProperty(value = "b", required = true) String b,
            @JsonProperty(value = "c", required = true) String c,
            @JsonProperty(value = "d", required = true) String d, 
            @JsonProperty(value = "e", required = true) String e, 
            @JsonProperty(value = "f", required = true) String f,
            // optional fields
            @JsonProperty(value = "g") String g, 
            @JsonProperty(value = "h") String h, 
            @JsonProperty(value = "i") String i, 
            @JsonProperty(value = "j") String j,
            @JsonProperty(value = "k") String k) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
        this.g = g;
        this.h = h;
        this.i = i;
        this.j = j;
        this.k = k;
    }
    public Optional<String> getG() {
        return Optional.ofNullable(g);
    }
    public Optional<String> getH() {
        return Optional.ofNullable(h);
    }
    public Optional<String> getI() {
        return Optional.ofNullable(i);
    }
    public Optional<MessageType> getJ() {
        return Optional.ofNullable(j);
    }
    public Optional<String> getK() {
        return Optional.ofNullable(k);
    }
    public String getA() {
        return a;
    }
    public String getB() {
        return b;
    }
    public String getC() {
        return c;
    }
    public String getD() {
        return d;
    }
    public String getE() {
        return e;
    }
    public String getF() {
        return f;
    }
}

现在,我试图通过使用Google的AutoValue库来解决一些问题,然后该代码看起来好一些,但是仍然有一个带有许多领域的构造函数的调用。

Messagea.java

@AutoValue
@JsonInclude(Include.NON_EMPTY)
public abstract class MessageA extends NetworkMessage {
    // required fields
    @Nonnull public abstract String getFieldA();
    @Nonnull public abstract String getFieldB();
    @Nonnull public abstract String getFieldC();
    @Nonnull public abstract String getFieldD();
    @Nonnull public abstract String getFieldE();
    @Nonnull public abstract String getFieldF();
    // optional fields
    @Nullable public abstract String getFieldG();
    @Nullable public abstract String getFieldH();
    @Nullable public abstract String getFieldI();
    @Nullable public abstract String getFieldJ();
    @Nullable public abstract String getFieldK();
    @JsonCreator
    private static MessageA create(
              // required fields
              @JsonProperty(value = "a", required = true) String a,
              @JsonProperty(value = "b", required = true) String b,
            @JsonProperty(value = "c", required = true) String c,
            @JsonProperty(value = "d", required = true) String d,
            @JsonProperty(value = "e", required = true) String e,
            @JsonProperty(value = "f", required = true) String f,
            // optional fields
            @JsonProperty(value = "g") String g,
            @JsonProperty(value = "h") String h,
            @JsonProperty(value = "i") String i,
            @JsonProperty(value = "j") String j,
            @JsonProperty(value = "k") String k) {
        return new AutoValue_MessageA(
                a, b, c, d, e, f, g, h, I, j, k);
    }
}

现在这是更好的,但是有一个问题,我不能拥有可选的返回类型,因此我可以在我的代码中浮动null值,并且应该在其他地方执行许多无效检查。

您的建议是什么?

如果您真的需要/需要将这些JSON消息表示为Pojos,则至少可以通过仅定义所需的字段并使用Lombok来绕过所有样板Getter/setter/setter/ctor噪声Getter/setter/ctor生成。通过用@Data @Data注释课程,您可以免费获得Getters/setter/ctor,而无需看到涉及的样板。

@Data
public class MessageA extends NetworkMessage {
private final String a;

将导致一个看起来像这样(以及更多)

的课程
@Data
public class MessageA extends NetworkMessage {
private final String a;
public MessageA(String a){
  this.a=a;
}
public String getA(){
  return this.a;
}
/*
*No setter since the field is private
*public void setA(String a){
*  this.a=a;
*}
*public boolean equals(Object o){...}
*public String toString(){...}
*/

我一直在使用Lombok,以避免必要的混乱。

,但也许您最好完全避免使用这些数据类别。这样的巨大信息看起来并不代表一个概念,而是几个嵌套的概念。否则,只需将JSON存储为JSONOBject并提供直接从JSON获取值的Getter(您将有更轻松的时间以这种方式配置/验证复杂条件)

相关内容

  • 没有找到相关文章

最新更新