Valutare JSON da popolari auto-suggerimenti

0

Stavo valutando i vari modi in cui i grandi ragazzi implementano l'auto suggerire. Queste sono le mie osservazioni (la stringa di ricerca utilizzata era "ab"). Domande verso la fine.

Yahoo ha provato qualcosa del genere, in cui la risposta era un JSONP. La risposta è leggibile e serve allo scopo.

Risposta di Yahoo

yasearch({"q":"ab ","gprid":"Y435dN7TRFqnYqQhnBueJA","f":["k","m"],"r":[["ab de villiers",0],["ab exercises",0],["ab king pro",0],
["ab infi-net internet banking",0],["ab mujhe raat din",0],["ab workouts",0],["ab mp3",0],["ab meri bari",0],["ab ke baras",0],["ab meri baari",0]]})

Bing aveva un approccio simile. Restituisce un blocco "se", sa_inst.apiCB () sembra essere una funzione che processerebbe il JSON. Anche in questo caso la risposta è leggibile e legittima.

Risposta di Bing

if(typeof sa_inst.apiCB == 'function') sa_inst.apiCB({"AS":{"Query":"ab","FullResults":1,"Results":[{"Type":"AS","Suggests": [{"Txt":"ab<strong>p</strong> <strong>news</strong>","Type":"AS","Sk":""}, 
{"Txt":"ab<strong>bottapp</strong>.ab<strong>bott</strong>.<strong>in</strong>","Type":"AS","Sk":"AS1"},{"Txt":"ab<strong>t</strong> <strong>travels</strong>","Type":"AS","Sk":"AS2"},{"Txt":"ab<strong>p</strong> <strong>ananda</strong>","Type":"AS","Sk":"AS3"},
{"Txt":"ab<strong>hibus</strong>","Type":"AS","Sk":"AS4"},{"Txt":"ab<strong>p</strong> <strong>maza</strong>","Type":"AS","Sk":"AS5"},  {"Txt":"ab<strong>b</strong>","Type":"AS","Sk":"AS6"},
{"Txt":"ab<strong>outgoogle</strong>","Type":"AS","Sk":"AS7"}]}]}} /* pageview_candidate */);

Ora arriva Google. La risposta viene inviata come 2 oggetti JSON (separati da / "" /). La maggior parte è illeggibile.

Risposta di Google

{e:"XteVUYKqDoKHrAfdz4D4Aw",c:0,u:"https://www.google.com/s?hl\x3den\x26gs_rn\x3d14\x26gs_ri\x3dpsy-ab\x26tok\x3dvsobDhICRmdcnY7ayKTGng\x26cp\x3d2\x26gs_id\x3dd\x26xhr\x3dt\x26q\x3dab\x26es_nrs\x3dtrue\x26pf\x3dp\x26output\x3dsearch\x26sclient\x3dpsy-ab\x26oq\x3d\x26gs_l\x3d\x26pbx\x3d1\x26bav\x3don.2,or.r_cp.r_qf.\x26bvm\x3dbv.46751780,d.bmk\x26fp\x3d2647af89de6b6c61\x26biw\x3d1366\x26bih\x3d453\x26tch\x3d1\x26ech\x3d2\x26psi\x3dVteVUcYuzOGsB6LpgdgB.1368774484351.1",p:true,d:"[\x22ab\x22,     
[[\x22ab\u003Cb\u003Ec\u003C\/b\u003E\x22,0,[]],[\x22ab\u003Cb\u003Ec news\u003C\/b\u003E\x22,0,[]],[\x22ab\u003Cb\u003Eercrombie\u003C\/b\u003E\x22,0,[]],[\x22ab\u003Cb\u003Ecya\u003C\/b\u003E\x22,0,[]]],
{\x22j\x22:\x22d\x22,\x22q\x22:\x22t8z6h8KhWvbkEX6xablxgYxDUq4\x22,\x22t\x22:
{\x22bpc\x22:false,\x22tlw\x22:false}}]"}
/*""*/
{e:"XteVUYKqDoKHrAfdz4D4Aw",c:-1,u:"https://www.google.com/searchdata?hl\x3den\x26gs_rn\x3d14\x26gs_ri\x3dpsy-ab\x26tok\x3dvsobDhICRmdcnY7ayKTGng\x26cp\x3d2\x26gs_id\x3dd\x26xhr\x3dt\x26q\x3dab\x26es_nrs\x3dtrue
\x26pf\x3dp\x26output\x3dsearch\x26sclient\x3dpsy-ab\x26oq\x3d\x26gs_l\x3d\x26pbx\x3d1\x26bav\x3don.2,or.r_cp.r_qf.\x26bvm\x3dbv.46751780,d.bmk\x26fp\x3d2647af89de6b6c61\x26biw\x3d1366\x26bih\x3d453\x26tch\x3d1\x26ech\x3d2\x26psi\x3dVteVUcYuzOGsB6LpgdgB.1368774484351.1",
p:true,d:"{\x22snp\x22:1}"}
/*""*/
  1. Sono quei codici esadecimali o come li chiami?
  2. Perché è necessario restituire 2 oggetti?
  3. Qual è la necessità di codificare il JSON?
  4. Qual è il formato ideale per JSON tra questi tre?

Qualche idea su questo è il benvenuto.

    
posta Uzair 17.05.2013 - 12:07
fonte

1 risposta

3

JSONP non è tecnicamente una cosa, in realtà è solo Javascript. Quindi non è JSON ma inizializzatori di oggetti Javascript.

Se si nota, la risposta di Google non viene eseguita come codice JavaScript né è JSON valido. Quindi non fa nulla se un sito di terze parti lo include come una sceneggiatura. Quelli non sono sicuramente 2 oggetti JSON perché le chiavi non sono quotate. Sono Javascript inizializzatori di oggetti che hanno una proprietà che contiene una stringa JSON che può essere analizzata come JSON.

Puoi ottenere il JSON dalla prima parte in questo modo:

var res = '{e:"XteVUYKqDoKHrAfdz4D4Aw",c:0,u:"https://www.google.com/s?hl\x3den\x26gs_rn\x3d14\x26gs_ri\x3dpsy-ab\x26tok\x3dvsobDhICRmdcnY7ayKTGng\x26cp\x3d2\x26gs_id\x3dd\x26xhr\x3dt\x26q\x3dab\x26es_nrs\x3dtrue\x26pf\x3dp\x26output\x3dsearch\x26sclient\x3dpsy-ab\x26oq\x3d\x26gs_l\x3d\x26pbx\x3d1\x26bav\x3don.2,or.r_cp.r_qf.\x26bvm\x3dbv.46751780,d.bmk\x26fp\x3d2647af89de6b6c61\x26biw\x3d1366\x26bih\x3d453\x26tch\x3d1\x26ech\x3d2\x26psi\x3dVteVUcYuzOGsB6LpgdgB.1368774484351.1",p:true,d:"[\x22ab\x22,[[\x22ab\\u003Cb\\u003Ec\\u003C\\/b\\u003E\x22,0,[]],[\x22ab\\u003Cb\\u003Ec news\\u003C\\/b\\u003E\x22,0,[]],[\x22ab\\u003Cb\\u003Eercrombie\\u003C\\/b\\u003E\x22,0,[]],[\x22ab\\u003Cb\\u003Ecya\\u003C\\/b\\u003E\x22,0,[]]],{\x22j\x22:\x22d\x22,\x22q\x22:\x22t8z6h8KhWvbkEX6xablxgYxDUq4\x22,\x22t\x22:{\x22bpc\x22:false,\x22tlw\x22:false}}]"}'

console.log(JSON.parse(eval("(" + res  + ")" ).d));

Si noti che ho aggiunto ulteriori barre in modo che il% iniziale di% co_de sia esattamente lo stesso perché attraversa un'interpolazione di stringa aggiuntiva che altrimenti non avrebbe attraversato.

Un sito Web di terze parti non può estrarre il contenuto dello script, può solo eseguirlo. Se Google includesse direttamente JSON, un sito di terze parti potrebbe semplicemente sovrascrivere i costruttori Object / Array e accedere ai dati.

Vedi

link

link

link

    
risposta data 17.05.2013 - 13:37
fonte

Leggi altre domande sui tag