2013-06-25 4 views
0

Я столкнулся с очень странным поведением jQuery, связанным с json. Ниже приведен мой код, в котором я отправляю запрос POST на сервлет, который отправляет ответ JSON. Я могу получить значения для большинства запросов, но некоторые для некоторых запросов, я получаю следующее сообщение об ошибке при получении значений из JSON:weird json parse issue with jQuery

parsererror, SyntaxError: JSON.parse: bad control character in string literal 

Но когда я проверяю, что JSON ответ (я получаю его от затмения console) на этом сайте: enter link description here

Этот сайт анализирует JSON без ошибок! На сайт-> скопируйте любой JSON в текстовое поле на вкладке «Текст», затем нажмите «вкладка« Просмотр ». Он будет разбирать его правильно.

После 2-3 JSONs, для которых JQuery отчетов об ошибках -

{"topics": [{ "categoryName":"Law Crime" , "score":"90%"}],"socialTags": [{ "originalValue":"Social inequality" , "importance":"1"},{ "originalValue":"Affirmative action" , "importance":"1"},{ "originalValue":"Discrimination" , "importance":"1"},{ "originalValue":"Education policy" , "importance":"2"},{ "originalValue":"Politics" , "importance":"2"},{ "originalValue":"Ethics" , "importance":"2"},{ "originalValue":"Social philosophy" , "importance":"2"},{ "originalValue":"Same-sex marriage in Canada" , "importance":"2"},{ "originalValue":"Affirmative action in the United States" , "importance":"2"},{ "originalValue":"Same-sex marriage in the United States" , "importance":"2"},{ "originalValue":"Law Crime" , "importance":"1"}],"entities": [{ "_type":"Facility" , "name":"Supreme 
Court"},{ "_type":"Organization" , "name":"Supreme 
Court"}]} 

Я пробовал много раз, и каждый раз, когда для этих JSONs я получаю ту же ошибку.

Я создаю эти JSONs на задней части сервлета.

Ниже мой код для получения значений из JSON в JQuery:

$.ajax({ 
     type: 'POST', 
     //servlet url 
     url: 'calaiscaller', 
     // parameters 
     data: {content: summary}, 
     // expected data-type of response 
     dataType: 'json', 
     // to execute when got the json result 
     success: function(jsonResponse){    
      // clear the old topic data 
      $('#topics').empty(); 
      $('#topics').append("<p class='text-left label label-info'>Topics:</p>"); 
      // add new topic data 
      $.each(jsonResponse.topics, function(){ 
       var topicData="<p><span class='text-left'>" + this.categoryName + "</span><span class='pull-right'>" + this.score + "</span></p>"; 
       $('#topics').append(topicData); 
      }); 

      // clear new social-tag data 
      $('#social-tags').empty(); 
      $('#social-tags').append("<p class='text-left label label-info'>Social Tags:</p>"); 
      // add new social-tag data 
      $.each(jsonResponse.socialTags, function(){ 
       var socialTagData="<p><span class='text-left'>" + this.originalValue + "</span><span class='pull-right'>" + this.importance + "</span></p>"; 
       $('#social-tags').append(socialTagData); 
      }); 

      // clear new entities data 
      $('#entities').empty(); 
      $('#entities').append("<p class='text-left label label-info'>Entities:</p>"); 
      // add new entities data 
      $.each(jsonResponse.entities, function(){ 
       var entitiesData="<p><span class='text-left'>" + this._type + "</span><span class='pull-right'>" + this.name + "</span></p>"; 
       $('#entities').append(entitiesData); 
      }); 

      //alert('success'); 
      // write the success status 
      $('#statusField'+uniqueId).addClass('alert alert-success pull-left'); 
      $('#statusField'+uniqueId).append('Success!'); 
     }, 

     // to execute when error 
     error: function(jqXHR, textStatus, errorThrown){ 
      //alert("error"); 
      //alert(textStatus); 
      //alert(errorThrown); 
      // print the error 
      // write the error message 
      $('#statusField'+uniqueId).addClass('alert alert-error pull-left'); 
      $('#statusField'+uniqueId).append('Error: '+textStatus+', '+errorThrown); 
     }, 

     // always executed at last whether success or error 
     complete: function(){ 
      // bring back submit button to its original state 
      $('.showinfo').button('reset'); 
      // hide the progress bar 
      $('#progress').hide(); 
      // fade in the results 
      $('#resultbox').fadeIn('slow', function(){ 

      }); 
     } 
    }); 

Помощь!

+5

Эта ошибка, как правило, появляется в действительном - ** смотрит ** JSON, когда невидимый символ Юникода (без пробелов или необычный пробел или что-то подобное) каким-то образом волшебным образом нашел способ войти в ответ. –

+1

http://jsonlint.com/ дает лучшие подсказки, что не так с JSON. – Christoph

+0

Это недействительно json on line '57' –

ответ

2

Ваш оригинальный JSON был недействительным из-за возврата каретки в значениях. В первой строке JSON:

"name": "U.S. 
Supreme Court" 

Во второй строке:

"name": "Supreme 
Court" 

Если вы хотите использовать возврат каретки \n, как в "Supreme\nCourt" - но я подозреваю, что вы на самом деле не хочу, чтобы вы просто нужно пространство.

Если у вас есть конкретная строка JSON, дающая ошибку, вы можете подтвердить ее по адресу http://jsonlint.com/.

+0

ах, это правильный контрольный символ, относится к возвратам .. должен был знать, что просто не ударил мозг – mcgrailm

+0

aaha! После выполнения replaceAll ([\ n \ r], ""); он решен! Благодаря! – kunal18