6
respostas

Inserindo uma lista com Json no java

Pessoal, iniciando no Java, gostaria de saber como fazer um post usando RestAPI usando o seguinte json: [ { "produto": "produto 1", "codigo": 42, "unidade": "un", "quantidade": 1, "valorunitario": "145,65", "valortotal": "145,65", "datavenda": "03/01/2022", "formapagamento": "Cartão de Crédito" }, { "produto": "produto 2", "codigo": "EBF0001", "unidade": "un", "quantidade": 1, "valorunitario": "235,00", "valortotal": "235,00", "datavenda": "03/01/2022", "formapagamento": "Cartão de Crédito" }, { "produto": "produto 3", "codigo": 9502, "unidade": "un", "quantidade": 1, "valorunitario": "200,00", "valortotal": "200,00", "datavenda": "03/01/2022", "formapagamento": "Cartão de Crédito" }]

Escrevi o seguinte código:

@RestController @RequestMapping("importa_modelo01") public class ProdutoController {

@Autowired
private ProdutoRepository repository;

@PostMapping
@Transactional
public void importar(@RequestBody DadosProduto dados) {

    repository.save(new Produto(dados));
}

}

Sei que o problema é como interar o Json como lista, é exatamente o que não estou conseguindo, qnd passo apenas um produto funciona certinho. Desde já agradeço.

6 respostas

Olá Carlos, tudo bem?

Para interagir com a lista de objetos JSON, você pode usar o tipo de dados List<> do Java e, em seguida, iterar sobre os elementos da lista usando um loop for ou um loop foreach.

Supondo que você tenha uma classe Produto que corresponde à estrutura do JSON, você pode fazer o seguinte:

public class ListaProdutos {
    private List<Produto> produtos;

    public List<Produto> getProdutos() {
        return produtos;
    }

    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }
}
@PostMapping
@Transactional
public void importar(@RequestBody ListaProdutos lista) {
    for (Produto p : lista.getProdutos()) {
        repository.save(p);
    }
}

O JSON para passar nessa API seria algo assim:

{
    "produtos": [
        {
            "produto": "produto 1",
            "codigo": 42,
            "unidade": "un",
            "quantidade": 1,
            "valorunitario": "145,65",
            "valortotal": "145,65",
            "datavenda": "03/01/2022",
            "formapagamento": "Cartão de Crédito"
        },
        {
            "produto": "produto 2",
            "codigo": "EBF0001",
            "unidade": "un",
            "quantidade": 1,
            "valorunitario": "235,00",
            "valortotal": "235,00",
            "datavenda": "03/01/2022",
            "formapagamento": "Cartão de Crédito"
        },
        {
            "produto": "produto 3",
            "codigo": 9502,
            "unidade": "un",
            "quantidade": 1,
            "valorunitario": "200,00",
            "valortotal": "200,00",
            "datavenda": "03/01/2022",
            "formapagamento": "Cartão de Crédito"
        }
    ]
}

Obrigado Otavio, agora está apresentando esse erro: Cannot deserialize value of type produto.ListaProdutos from Array value (token JsonToken.START_ARRAY)]

Olá Carlos, tudo bem?

Esse erro "Cannot deserialize value of type produto.ListaProdutos from Array value (token JsonToken.START_ARRAY)" é gerado porque o JSON enviado na request está sendo interpretado como um array, mas a classe ListaProdutos espera um objeto JSON com um campo "produtos" que é um array de objetos do tipo Produto.

Quando você testou, como você enviou o body do request?

Estou usando o Insominia e passei assim:

[
  {
    "produto": "Produto 1",
    "codigo": "42",
    "unidade": "un",
    "quantidade": 1,
    "valorunitario": 145.65,
    "valortotal": 145.65,
    "datavenda": "03/01/2022",
    "formapagamento": "Cartão de Crédito"
  },
  {
    "produto": "Produto 2",
    "codigo": "EBF0001",
    "unidade": "un",
    "quantidade": 1,
    "valorunitario": 235.00,
    "valortotal": 235.00,
    "datavenda": "03/01/2022",
    "formapagamento": "Cartão de Crédito"
  }
  ]

A classe ListaProdutos espera um objeto JSON com um campo "produtos" que é um array de objetos do tipo Produto.

Tenta passar assim:

{
    "produtos": [
        {
            "produto": "produto 1",
            "codigo": 42,
            "unidade": "un",
            "quantidade": 1,
            "valorunitario": "145,65",
            "valortotal": "145,65",
            "datavenda": "03/01/2022",
            "formapagamento": "Cartão de Crédito"
        },
        {
            "produto": "produto 2",
            "codigo": "EBF0001",
            "unidade": "un",
            "quantidade": 1,
            "valorunitario": "235,00",
            "valortotal": "235,00",
            "datavenda": "03/01/2022",
            "formapagamento": "Cartão de Crédito"
        },
        {
            "produto": "produto 3",
            "codigo": 9502,
            "unidade": "un",
            "quantidade": 1,
            "valorunitario": "200,00",
            "valortotal": "200,00",
            "datavenda": "03/01/2022",
            "formapagamento": "Cartão de Crédito"
        }
    ]
}

Ou você também pode alterar a classe ListaProdutos para lidar com um array em vez de um objeto JSON com um campo "produtos". Nesse caso, a classe seria algo como:

public class ListaProdutos {
    private Produto[] produtos;

    public Produto[] getProdutos() {
        return produtos;
    }

    public void setProdutos(Produto[] produtos) {
        this.produtos = produtos;
    }
}

Nesse caso, o JSON que você mandou deve funcionar:

[
  {
    "produto": "Produto 1",
    "codigo": "42",
    "unidade": "un",
    "quantidade": 1,
    "valorunitario": 145.65,
    "valortotal": 145.65,
    "datavenda": "03/01/2022",
    "formapagamento": "Cartão de Crédito"
  },
  {
    "produto": "Produto 2",
    "codigo": "EBF0001",
    "unidade": "un",
    "quantidade": 1,
    "valorunitario": 235.00,
    "valortotal": 235.00,
    "datavenda": "03/01/2022",
    "formapagamento": "Cartão de Crédito"
  }
  ]