2009-10-09 3 views
14

utilizzando jQuery, sono in grado di inviare oggetti JSON dal client al server utilizzando Ajax in questo modo:Dimensione massima dell'oggetto JSON?

var strJSON = '{"event":[{ 
    "dates":[ 
     "2009-10-14","2009-10-15"], 
    "teams":[ 
     {"id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":""}, 
     {"id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":""}, 
     {"id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":""}, 
     {"id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":""}] 
}]}'; 

$.ajax({ 
    url: '../ajax/save_event', 
    type: 'POST', 
    data: { data : strJSON }, 
    dataType: 'json', 
    timeout: 8000, 
    cache: false 
}); 

funziona bene. Ma se la stringa JSON diventa molto più grande (non è sicuro della dimensione esatta, ma da qualche parte circa 5 volte più grande), i dati $ _POST ricevuti dal server sono vuoti. Qualcuno sa perché?

Sto usando Apache/PHP/jquery. Succede sia da IE che da Firefox. C'è un settaggio di configurazione da qualche parte che devo regolare?

Ecco un esempio di una stringa che non riesce a fare attraverso:

{"events":[{"dates":["2009-10-10","2009-10-11","2009-10-12"],"divisions":[{"level":"Collegiate","name":"Varsity","subdivision":"Division I","rounds":[],"teams":[{"id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":""},{"id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":""},{"id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":""},{"id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":""},{"id":"4","country":"USA","state":"CA","name":"Stanford University","subteam":""},{"id":"5","country":"USA","state":"CA","name":"University of California, Davis","subteam":""},{"id":"6","country":"USA","state":"CA","name":"San Francisco State University","subteam":""},{"id":"7","country":"USA","state":"CA","name":"Lassen Community College","subteam":""},{"id":"8","country":"USA","state":"CA","name":"Menlo College","subteam":""},{"id":"9","country":"USA","state":"CA","name":"Fresno Pacific University","subteam":""},{"id":"10","country":"USA","state":"CA","name":"Bakersfield","subteam":""},{"id":"11","country":"USA","state":"CA","name":"Buchanan","subteam":""},{"id":"12","country":"USA","state":"CA","name":"Campolindo-Moraga","subteam":""},{"id":"13","country":"USA","state":"CA","name":"Fremont-Sunnyvale","subteam":""},{"id":"14","country":"USA","state":"CA","name":"Ponderosa-Shingle Springs","subteam":""},{"id":"15","country":"USA","state":"CA","name":"West Covina","subteam":""},{"id":"16","country":"USA","state":"CA","name":"Gilroy","subteam":""},{"id":"17","country":"USA","state":"CA","name":"San José State University","subteam":""},{"id":"18","country":"USA","state":"CA","name":"University of California, Los Angeles","subteam":""},{"id":"19","country":"USA","state":"CA","name":"Sierra College","subteam":""},{"id":"20","country":"USA","state":"CA","name":"Selma","subteam":""},{"id":"21","country":"USA","state":"CA","name":"Liberty","subteam":""}],}]}]} 

è stato creato utilizzando json.org di "stringa i":

var strJSON = JSON.stringify(oEvent); 

EDIT: Indagare ulteriormente, ho cambiato il dataType in "testo" e provato a inviare una lunga stringa di numeri. Funziona fino a ~ 3500 caratteri quindi soffoca (e quando dico "choke" intendo che la richiesta arriva al server con $ $ _POST nullo)

Il mio PHP post_max_size è 64M, quindi non è così. Qualcuno ha suggerito di usare "LimitRequestBody" di Apache che non era in httpd.conf, quindi ho aggiunto "LimitRequestBody 0" ad esso e ho riavviato Apache. Neanche questo ha aiutato.

Altri suggerimenti ???

+1

Puoi provare a fare in modo che non inizi una stringa? Come in, basta avere un oggetto JavaScript che passi al parametro 'data' della chiamata' ajax'. Guarda cosa succede. – rfunduk

+2

Si prega di pubblicare un esempio di JSON in errore. 5 volte più grande di quello che hai postato non è poi così grande. Potrebbe essere un problema di escape o un problema di struttura nella stringa JSON. – Asaph

+0

OK, ho appena aggiunto un esempio sopra. È stato creato con stringify(). –

risposta

6

Ciò è probabilmente dovuto alla configurazione del server. Controlla php.ini per l'impostazione max_post_size e assicurati che sia sufficientemente grande per pubblicare i tuoi dati. Controlla anche le impostazioni del tuo server web: Apache ha una direttiva LimitRequestBody che potrebbe causare il tuo problema. Infine, controlla il tuo server web e i log degli errori di PHP per vedere se il post di grandi dimensioni sta causando errori.

+0

Ho pensato anche a questo, ma questo è ciò che legge: post_max_size = 64M Questo è 64 megabyte, corretto? –

+0

Controllare anche httpd.conf per 'LimitRequestBody' – pix0r

+0

(e sì, 64 M == 64 megabyte). – pix0r

2

Sembra che ci sia un problema di dimensioni, quando collaudo la mia stringa Json tutto funziona quando la stringa è piccola, quando incremento la stringa (array php da codificare) l'output della stringa Json viene tagliato.

quando si esegue una lunghezza di stringa sulla stringa non riuscita, ottengo (7796). Così ho cambiato l'opzione max post nel file ini sia per cli che apache a 64M invece di 8M e sto ancora ottenendo lo stesso problema. Non penso che questo problema sia limitato all'apache LimitRequestBody poiché il php fornisce lo stesso output su CLI.

Un'altra cosa, quando si esegue var_dump sulla stringa json codificata, è possibile vedere quando viene interrotta e i tag JSON non vengono chiusi, quindi perché il decodificatore Json restituisce un valore null.

es

$strJson = file_get_contents('http://mydomain/page'); 
var_dump($strJson); 

Si vedrà dove la stringa viene tagliato fuori ed uno zero viene concatenato alla fine della produzione.

+1

Ronald, sei mai riuscito a trovare una soluzione a questo? Sto affrontando esattamente lo stesso problema, anche se la mia corda viene tagliata a 3127 caratteri – solefald

+1

Ciao! Sono anche interessato. Hai risolto questo? – Industrial

3

Solo un paio di suggerimenti per chiunque trovi questa pagina - Ho riscontrato un problema simile con una stringa JSON che non è stata analizzata utilizzando jQuery.parseJSON().

Sono imbarazzato nel dire che il mio problema (probabilmente non correlato al problema dell'OP) è stato in realtà causato da una singola citazione. L'evasione ha risolto il problema.Originariamente pensavo che fosse legato alla lunghezza delle corde, poiché sembrava che stessero accadendo solo con una stringa JSON lunga 8.000 caratteri, ma era la virgola che terminava la stringa nel posto sbagliato.

Tim, non so se avete fatto ad andare a fondo del problema originale, ma incollando la stringa da Lei forniti:

{"events":[{"dates":["2009-10-10","2009-10-11","2009-10-12"],"divisions":[{"level":"Collegiate","name":"Varsity","subdivision":"Division I","rounds":[],"teams":[{"id":"0","country":"USA","state":"CA","name":"California Polytechnic State University","subteam":""},{"id":"1","country":"USA","state":"CA","name":"California State University, Bakersfield","subteam":""},{"id":"2","country":"USA","state":"CA","name":"California State University, Fresno","subteam":""},{"id":"3","country":"USA","state":"CA","name":"California State University, Fullerton","subteam":""},{"id":"4","country":"USA","state":"CA","name":"Stanford University","subteam":""},{"id":"5","country":"USA","state":"CA","name":"University of California, Davis","subteam":""},{"id":"6","country":"USA","state":"CA","name":"San Francisco State University","subteam":""},{"id":"7","country":"USA","state":"CA","name":"Lassen Community College","subteam":""},{"id":"8","country":"USA","state":"CA","name":"Menlo College","subteam":""},{"id":"9","country":"USA","state":"CA","name":"Fresno Pacific University","subteam":""},{"id":"10","country":"USA","state":"CA","name":"Bakersfield","subteam":""},{"id":"11","country":"USA","state":"CA","name":"Buchanan","subteam":""},{"id":"12","country":"USA","state":"CA","name":"Campolindo-Moraga","subteam":""},{"id":"13","country":"USA","state":"CA","name":"Fremont-Sunnyvale","subteam":""},{"id":"14","country":"USA","state":"CA","name":"Ponderosa-Shingle Springs","subteam":""},{"id":"15","country":"USA","state":"CA","name":"West Covina","subteam":""},{"id":"16","country":"USA","state":"CA","name":"Gilroy","subteam":""},{"id":"17","country":"USA","state":"CA","name":"San José State University","subteam":""},{"id":"18","country":"USA","state":"CA","name":"University of California, Los Angeles","subteam":""},{"id":"19","country":"USA","state":"CA","name":"Sierra College","subteam":""},{"id":"20","country":"USA","state":"CA","name":"Selma","subteam":""},{"id":"21","country":"USA","state":"CA","name":"Liberty","subteam":""}],}]}]} 

in http://json.parser.online.fr/ dà il seguente errore, se questo è di alcun aiuto a chiunque altro:

SyntaxError: JSON.parse: expected double-quoted property name

+0

[Un commento utente anonimo] (http://stackoverflow.com/suggested-edits/219484): dopo l'array è presente una virgola finale che causa questo errore: '..." Liberty "," sottoteam " ":" "}],}]}]} Questo è JSON errato. Alcuni browser possono recuperare ignorando le virgole finali, ma alcuni non possono analizzarlo. – Rup

1

'jsonp' tipo di dati non e non è possibile utilizzare il metodo POST. Invece tutti i dati sono passati in una stringa di query. Pertanto, se viene superata la lunghezza massima della stringa di query del server, i dati non verranno passati. La ragione di ciò è che jQuery carica i dati JSON come nodo nel tuo documento html, e questo può essere fatto solo come GET. Se hai bisogno di più dati dovrai usare XML o altro.

+0

Dovrebbe aver specificato (pensato di averlo fatto): La richiesta json viene inviata aggiungendo un nodo