Случайная ошибка «Неожиданный токен в JSON»

0

Я использую AngularJS для разработки веб-сайта, и я делаю несколько выборок в API для отображения похожих продуктов, но у меня возникают проблемы, чтобы перечислять элементы, потому что в некоторых случаях случайным образом возвращается JSON: SyntaxError: Неожиданный токен в JSON в позиции 2512. У меня есть код:

$timeout(function() {
            console.log(id_filtroParecido);
            Conecta('get','getProdutosFiltrados', id_filtroParecido).then(function(val) {
                vm.respostaListaParecidos = val;
            });
        }, 100);

В приведенном выше коде функция Conecta выполняет поиск в БД и возвращает JSON. Но его непредсказуемость, как в ней, работает иногда, но не срабатывает в другое время.

Здесь пример JSON я получает и работает отлично:

[{"id_produto":"1","nome_produto":"Epson Impressora 1","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"1","marcadagua_produto":"0","descricao_produto":"<p>Descri&ccedil;&atilde;o da impressora Epson 1</p>","informacao_produto":"<p>Impressora a Raio Lazer</p>","tags_produto":"Impressora, Lazer, Epson","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"1-epson-impressora-1","imagem_principal":"288738cdb4b99c10e877a25089d46074.jpeg","tamanho":[{"id_produto_tamanho":"43","nome_produto_tamanho":"7- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"200","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"N\u00e3o","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"2","nome_produto":"Impressora Epson 2","ativo_produto":"1","destaque_produto":"0","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descri&ccedil;&atilde;o da impressora Epson 2</p>","informacao_produto":"<p>Informa&ccedil;&otilde;es t&eacute;cnicas da impressora Epson 2</p>","tags_produto":"","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"2-impressora-epson-2","imagem_principal":"c38bf5d110a03964740266c3ee43e123.jpeg","tamanho":[{"id_produto_tamanho":"42","nome_produto_tamanho":"5-\u00danico","valor_produto_tamanho":"500.00","quantidade_produto_tamanho":"199","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Sim","tem_promocao_produto_tamanho":"0"}]}]

Вот пример JSON, который иногда возвращает ошибку, иногда нет:

[{"id_produto":"6","nome_produto":"HP G42-214BR","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descri&ccedil;&atilde;o do note HP</p>","informacao_produto":"<p>Informa&ccedil;&otilde;es do note JP</p>","tags_produto":"tag1, tag2, tag3","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"6-hp-g42-214br","imagem_principal":"87c2ee41b5b8fc13db9a3c2db655667b.png","tamanho":[{"id_produto_tamanho":"54","nome_produto_tamanho":"1- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"352","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"9","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Ou em 10x de R$150.00","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"1","nome_produto":"Epson Impressora 1","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"1","marcadagua_produto":"0","descricao_produto":"<p>Descri&ccedil;&atilde;o da impressora Epson 1</p>","informacao_produto":"<p>Impressora a Raio Lazer</p>","tags_produto":"Impressora, Lazer, Epson","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"1-epson-impressora-1","imagem_principal":"288738cdb4b99c10e877a25089d46074.jpeg","tamanho":[{"id_produto_tamanho":"43","nome_produto_tamanho":"7- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"200","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"N\u00e3o","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"2","nome_produto":"Impressora Epson 2","ativo_produto":"1","destaque_produto":"0","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descri&ccedil;&atilde;o da impressora Epson 2</p>","informacao_produto":"<p>Informa&ccedil;&otilde;es t&eacute;cnicas da impressora Epson 2</p>","tags_produto":"","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"2-impressora-epson-2","imagem_principal":"c38bf5d110a03964740266c3ee43e123.jpeg","tamanho":[{"id_produto_tamanho":"42","nome_produto_tamanho":"5-\u00danico","valor_produto_tamanho":"500.00","quantidade_produto_tamanho":"199","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Sim","tem_promocao_produto_tamanho":"0"}]}]

И вот пример JSON, который всегда возвращает ошибку:

[{"id_produto":"1","nome_produto":"Epson Impressora 1","ativo_produto":"1","destaque_produto":"1","sob_encomenda_produto":"1","marcadagua_produto":"0","descricao_produto":"<p>Descri&ccedil;&atilde;o da impressora Epson 1</p>","informacao_produto":"<p>Impressora a Raio Lazer</p>","tags_produto":"Impressora, Lazer, Epson","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"1-epson-impressora-1","imagem_principal":"288738cdb4b99c10e877a25089d46074.jpeg","tamanho":[{"id_produto_tamanho":"43","nome_produto_tamanho":"7- Padr\u00e3o","valor_produto_tamanho":"1500.00","quantidade_produto_tamanho":"200","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"N\u00e3o","tem_promocao_produto_tamanho":"0"}]},{"id_produto":"2","nome_produto":"Impressora Epson 2","ativo_produto":"1","destaque_produto":"0","sob_encomenda_produto":"0","marcadagua_produto":"0","descricao_produto":"<p>Descri&ccedil;&atilde;o da impressora Epson 2</p>","informacao_produto":"<p>Informa&ccedil;&otilde;es t&eacute;cnicas da impressora Epson 2</p>","tags_produto":"","ordem":"1","acessos":"0","marca_produto":"","slug_produto":"2-impressora-epson-2","imagem_principal":"c38bf5d110a03964740266c3ee43e123.jpeg","tamanho":[{"id_produto_tamanho":"42","nome_produto_tamanho":"5-\u00danico","valor_produto_tamanho":"500.00","quantidade_produto_tamanho":"199","comprimento_produto_tamanho":"16","altura_produto_tamanho":"16","largura_produto_tamanho":"16","peso_produto_tamanho":"16","promocao_valor_produto_tamanho":"0.00","parcelamento_produto_tamanho":"Sim","tem_promocao_produto_tamanho":"0"}]}]

Obs: Я использую одни и те же продукты здесь, но он не зависит от того, какой продукт возвращается

Здесь мой заводской код, который я использую для привязки к Angular с PHP:

.factory('Conecta', ['$timeout','$q','AppService', function(time, q, Service) {
        return function(acao,api,parametro){
            var deferred = q.defer(); 
            switch(acao) {
                case 'get':
                    Service.apiGET(api,parametro).then(function(response) {      
                        if(response.status == 200){
                            deferred.resolve(response.data);
                        }else{
                            deferred.resolve(null);
                        }
                    }, function (error) {
                        console.error(error);
                    });
                    break;
                default:
                break;
            }          
            return deferred.promise;                
        };
    }])
  • 0
    Трудно сказать, учитывая, что вы не дали пример неисправного JSON.
  • 0
    звучит как недопустимое хранимое значение как-то нарушает JSON; когда это значение входит в число результатов, оно терпит неудачу.
Показать ещё 7 комментариев
Теги:
syntax-error

2 ответа

1
Лучший ответ

Иногда проблема может заключаться в том, что вы возвращаете не ясный JSON, как он сказал в правилах синтаксиса и ожидаемый по причине браузера. Тип Content-типа ответа - application/json, но возвращает строку, которая содержит что-то очень похожее на объект JS.
Здесь очень грубо различие между JS object JSON и JS object

JSON: {"param":"value"}
JS object: {param:"value"}

Обратите внимание на кавычки для имени ключей. Но трудно сказать, какова реальная проблема в вашем коде без JSON, которые терпят неудачу.

  • 0
    Я поставил пример JSON, который я получил в своем вопросе
  • 0
    Как было рассмотрено #Mike McCaughan, и проблем не обнаружено, проблема может заключаться в том, как вы отправляете / обрабатываете ответ JSON. Может случиться так, что вы передаете большие данные, которые разбиты на части сервером, но нетерпеливо анализируются браузером. Вам нужно взглянуть на ваш обработчик и, возможно, использовать потоковый анализатор JSON. Пожалуйста, проверьте, что обрабатывается обработчиком, установите console.out (data), скопируйте и сделайте из него JSON.parse, это успешно?
Показать ещё 5 комментариев
0

Все ваши JSONs верны.
Вы можете выполнять

JSON.parse('{"kk":11}');  

для каждого из них в некотором js REPL (например, в консоли браузера) для проверки этого факта.

Возможные проблемы:

  1. Вы пытаетесь разобрать часть JSON и должны загружать все куски раньше.
  2. Вы ошибаетесь в JSON, но не можете его поймать для примера по некоторым причинам.
  • 0
    Я получаю JSON от API точно так же, как я написал в вопросе, я использую CURL, чтобы получить их, но я использую фабрику, чтобы «общаться» с PHP от JS, и в моем контроллере я получаю ошибку, но на моем заводе мой JSON работает нормально. Я отредактирую свой вопрос, чтобы показать мой завод

Ещё вопросы

Сообщество Overcoder
Наверх
Меню