Próbuję użyć jQuery do wysłania obiektu JSON, który ma tablicę jako jedną z jego właściwości, do mojego punktu końcowego API. Zdefiniowałem to tak:

let bidding = {
  "name": $("#name").val(),
  "applicant": $("#applicant").val(),
  "start_date": $("#start_date").val(),
  "end_date": $("#end_date").val(),
  "products": []
}

$("#products").children(".dropdown").each(function(key, value) {
  bidding.products.push(
    {
    "product_name": $(value).children(".btn").text(),
    "quantity": $(value).children("input").val()
    }
  );
});

A kiedy robię console.log(JSON.stringfy(bidding)) analizuje równie jak oczekiwano, na przykład:

{
  "name":"Material de Construção",
  "applicant":"Prefeitura",
  "start_date":"26/09/2017",
  "end_date":"01/10/2017",
  "products":[
    {"product_name":"Cimento (5kg)","quantity":"200"},
    {"product_name":"Tijolo","quantity":"100"},
    {"product_name":"Caneta","quantity":"5"}
  ]
}

Ale kiedy opublikuję go przy użyciu $.post("/api", bidding); Moje API, które go otrzymuje:

{
  name: 'Material de Construção',
  applicant: 'Prefeitura',
  start_date: '26/09/2017',
  end_date: '01/10/2017',
  'products[0][product_name]': 'Cimento (5kg)',
  'products[0][quantity]': '200',
  'products[1][product_name]': 'Tijolo',
  'products[1][quantity]': '100',
  'products[2][product_name]': 'Caneta',
  'products[2][quantity]': '5'
}

Jak mogę to zrobić, aby jQuery przestanie tworzyć nowe właściwości dla każdego wpisu w tablicy i zamiast tego wysłać całą tablicę jako pojedynczą nieruchomość?

1
Telmo Trooper 26 wrzesień 2017, 23:45

2 odpowiedzi

Najlepsza odpowiedź

Musisz ustawić na false:

ProcessData: Domyślnie dane przekazywane do opcji Data jako obiektu (technicznie, cokolwiek Inny niż ciąg) zostanie przetworzony i przekształcony w ciągu zapytań, montaż do domyślnej aplikacji "Application / X-WWW-formularz-Urlencoded". Jeśli chcesz wysłać Domdocument lub inne dane bez przetworzonego, ustaw tę opcję, aby false.

Stąd twój post będzie:

$.ajax({
    type: "POST",
    url: "/api",
    data: JSON.stringify(bidding),
    processData: false,
    contentType: "application/json",
    dataType:"json",
    success: function () {
    }
});
2
Telmo Trooper 26 wrzesień 2017, 21:16
$.post("/api", JSON.stringify(bidding));

I na stronie dekodowania serwera JSON. Jeśli używasz PHP Użyj JSON_DECODE

Korzystanie z JSON jest zawsze dobrym pomysłem, aby zachować strukturę danych

1
Luis Cabrera Benito 26 wrzesień 2017, 21:03