【问题标题】:JSON don't repeat some attributes and respective valuesJSON 不重复某些属性和各自的值
【发布时间】:2022-01-15 12:01:05
【问题描述】:

对于同一模型类的第二次序列化的所有实例,对象仅具有它们应有的一部分属性及其各自的值。这样,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是下面模型类Pedido列表的序列化:

@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;
}
}

模型类Fornecedor是:

@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;
}

而模型类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 spring-boot spring-data-jpa json-view


    【解决方案1】:

    您获得的 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 {
        (...)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-20
      • 2019-02-16
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多