JSON 不要重复某些属性和各自的值

JSON don't repeat some attributes and respective values

对于序列化的所有实例,从第二次出现开始,同一模型class,对象只有一部分属性和它们应该有的各自的值。这样 JSON 文件结构就不像应用程序的旧部分(前端)所期望的那样均匀和统一。

[
{
    "id": 1,
    "fornecedor": {
        "cnpj": "80000876000177",
        "nome": "ATACADÃO DIA-A-DIA"
    },
    "itens": [
        {
            "id": 2,
            "produto": {
                "gtin": "7891991010856",
                "nome": "CERVEJA BUDWEISER"
            },
            "quantidade": 3,
            "preco": 3.5,
            "total": 10.5
        }
    ]
},
{
    "id": 3,
    "fornecedor": {
        "cnpj": "19600347000101",
        "nome": "SUPERMERCADO BELLA-VIA"
    },
    "itens": [
        {
            "id": 4,
            "produto": {
                "gtin": "7891991010857",
                "nome": "CERVEJA HEINEKEN"
            },
            "quantidade": 4,
            "preco": 5.4,
            "total": 21.6
        }
    ]
},
{
    "id": 5,
    "fornecedor": "19600347000101",
    "itens": [
        {
            "id": 6,
            "produto": "7891991010856",
            "quantidade": 4,
            "preco": 3.2,
            "total": 12.8
        }
    ]
},
{
    "id": 7,
    "fornecedor": "80000876000177",
    "itens": [
        {
            "id": 8,
            "produto": "7891991010857",
            "quantidade": 5,
            "preco": 4.9,
            "total": 24.5
        }
    ]
}
]

在上面的 JSON 中,带有 id:1 和 id:7 的实例有一个名为 fornecedor 的字段,它在结构上是不同的,这不应该是因为前端期望他们是一样的。其他样本是 id:2 和 id:6 以及字段 produto 等等。

上面的JSON是下面classPedido的列表的序列化:

@Data
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 
public class Pedido {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonView(View.External.class)
private Long id;

@ManyToOne
@JoinColumn(name = "fornecedor_cnpj")
@JsonView(View.External.class)
private Fornecedor fornecedor;

@OneToMany(mappedBy = "pedido", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.External.class)
private List<Item> itens;

public List<Item> getItens() {
    if(itens == null){
        itens = new ArrayList<>();
    }
    return itens;
}
}

型号classFornecedor是:

@Data
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "cnpj")
public class Fornecedor {

@Id
@JsonView(View.External.class)
private String cnpj;

@JsonView(View.External.class)
private String nome;

@OneToMany(mappedBy = "fornecedor", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.Internal.class)
private List<Pedido> pedidos;

@OneToMany(mappedBy = "fornecedor", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.Internal.class)
private List<Disponibilidade> disponilidades;
}

而模型 class Produto 是:

@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "gtin")
@NoArgsConstructor
@Data
public class Produto {

@Id
@JsonView(View.External.class)
private String gtin;

@JsonView(View.External.class)
private String nome;

@OneToMany(mappedBy = "produto", fetch = FetchType.LAZY,
        cascade = CascadeType.ALL)
@JsonView(View.Internal.class)
private List<Disponibilidade> disponibilidades;

public Produto(String gtin) {
    this.gtin = gtin;
}
}

问题:JSON的结构是预期行为的表示?如果是这样,有人能告诉我如何使第一个实例中的所有实例始终具有所有属性及其各自的值(尽可能多地意味着重复的属性和值!)。

谢谢!

您得到的 JSON 是使用 @JsonIdentityInfo 的结果,您或其他人可能在将 Java 对象序列化为 JSON(您可以在 https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion 阅读更多相关信息)。这意味着在 fornecedorproduto 中拥有完整属性集的唯一方法是摆脱那些 类 上的 @JsonIdentityInfo。请记住,这可能会产生上述无限递归问题。

@Data
@Entity
public class Fornecedor {
    (...)
}
@Entity
@NoArgsConstructor
@Data
public class Produto {
    (...)
}