Json cu backslashes

Salut,

Lucrez cu doua API-uri (unul facut in python si celalalt in php) care imi returneaza un json care este un array de obiecte, fiecare obiect are perechi de cheie-valoare, unde valorile sunt alte obiecte si tot asa.

In unul din obiectele “mari” (primele din interiorul array ului), am o cheie numita “discount”, care are ca valoare un obiect care ar trebui sa fie {"percent": 30}, dar este "{\"percent\":30}"
Raspunul ar fi ceva de genul:
[{"name": "gigel", "type":"Worker", "discount": "{\"percent\":30}"}, {"name": "ionut", "type":"staff", "discount": "{\"percent\":20}"}]

Vad ca pot sa il parsez cu JSON.parse(), in consola (din Chrome) imi arata discount: "{"percent":30}"-> fara backslash (dar apare ca string, nu mi-l arata ca obiect un cu cheie/valoare care poate fi expandat).

Lucrez cu javascript vanilla + jquery.
Intrebarile ar fi:

  1. Cum pot sa parsez/abordez elemente care sunt escaped cu backslash? (am presupus ca sunt escaped, nu stiu exact daca asta a fost scopul in urma caruia cel care a facut asta a adaugat si backslash)
  2. De ce ai pune backslash? Am in alta parte alt raspuns de la alt api, dar din acelasi proiect, care, inainte de TOATE ghilimelele duble are backslash. De ce si pentru ce?

Le face escape.

Nu merge sa le citesti normal?
Browser-ul iti arata el un output fara backslash

Si e posibil ca backslashul sa cauzeze probleme cand parsez? Ar trebui sa ma ingrijesc sa scot eu backslash urile din raspuns inainte sa fac vreo operatie cu el?
thanx

ar trebui sa fie
“discount”: {“percent”: 30}

posibil ca la definire sa fie ceva in neregula. stiu ca pateam asta din PHP la un moment dat. vezi daca te ajuta sa ii faci type casting.

poate faci ceva de genul:

$discount = [ “percent” => 30 ];
$discount = json_encode( $discount );
$response = json_encode( [ “name” => “gigel”, “discount” => $discount ] );

ceea ce inseamna ca ii aplici de doua ori ‘encode’

1 Like

mda faza e ca eu ar trebui sa lucrez doar din front end, nu pot sa modific in php nimic

nu poti sa vorbesti cu cel care a facut api-ul
si scapi de toata bataia de cap

sau poti sa incerci asa

let data = JSON.stringify([{"name": "gigel", "type":"Worker", "discount": "{\"percent\":30}"}, {"name": "ionut", "type":"staff", "discount": "{\"percent\":20}"}])

let data1 = JSON.parse(data)

console.log(data1[0].name) //gigel

console.log(data1[0].discount) // {"percent":30}


//

atunci fa o sesizare catre cine a facut API-ul. nu e JSON valid, si chiar daca il rezolvi tu pentru faza asta e posibil sa iti dea batai de cap in alta parte.

daca nu ai la cine sa faci sesizare le poti trata individual, dupa ce le convertesti in obiect in JS, le iei la verificat daca sunt string si daca incep cu {. dar n-as recomanda varianta asta. sa-si faca fiecare treaba cum trebuie!

1 Like

nu prea am cum sa vorbesc cu cel care a facut api pentru ca si el e in criza de timp…

pai vezi aici

un pic mai sus :slight_smile:

1 Like

hmm suna bine. incerc acum. revin. va multumesc all. pace

pot sa te intreb aici de ce ai facut JSON.stringify() inainte de JSON.parse() ? JSON.stringify() mai ajuta si la altceva in afara sa transforme raspunsul in string?(oricum il primesc ca string)

l8er edit: in cazul meu daca ii dau JSON.stringify() inainte, si dupa il parsez cu JSON.parse(), nu mi-l mai parseaza, mi-l arata in consola ca string…

Pt ca mie imi da acesta eroare


Eu am copiat ceea ce ai postat tu si ai omis ghilimelele si acum este ca un array de obiecte. Incerca si fara stringify.
1 Like

e interesant ca apare backslash doar acolo unde NU e json valid, adica doar acolo unde a pus ghilimele inaintea acoladei (si in acelasi timp e cel mai “adanc” nivel de adancime in obiect)

Mai parseaza o data partea respectiva. E JSON valid dar in format string, din cauza backslash. le: am crezut ca e pus pe afara backslash.

Ce nu cred că realizezi este că JSON-ul ăla este valid și încerci să repari ceva ce nu este neapărat… defect.

Problema ta este că un anumit element din json este escaped extra. Nu intrăm în motivele pentru care se întâmplă asta (pentru că nu ai control asupra acestui lucru), dar tu ai așa:

data = {
  "discount": "{\"percent\":30}"
}

Altfel spus, tu ai: data.discount = "{\"percent\":30}".

Dacă nu poți repara API-ul, poți parsa încă o dată acel discount:

data.discount = JSON.parse( data.discount )

Sau, dacă vrei să tratezi problema la nivel global, treci prin tot obiectul când îți vine din api:

data = data.map(item => { 
  item.discount = JSON.parse(item.discount);
  return item
})
4 Likes

Sarumana, s-a facut lumina in intuneric.

Multumesc mult pentru raspunsuri.