javascript - 随机错误 "Unexpected token in JSON"

标签 javascript angularjs json syntax-error

我正在使用 AngularJS 开发一个网站,并且我在 API 中进行多次选择来列出类似的产品,但我在列出项目时遇到了麻烦,因为在某些情况下,JSON 会随机返回:语法错误: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"}]}]

观察:我在这里使用相同的产品,但它与返回的产品无关

这是我用来连接 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;                
        };
    }])

最佳答案

有时问题可能是你返回的不是一个清晰的 JSON,正如语法规则中所述和浏览器预期的那样,因为响应的内容类型是 application/json,但返回一个字符串,其中包含与 JS 非常相似的内容对象。
这是 JSONJS 对象

之间非常粗略的区别

JSON: {"param":"value"}
JS 对象:{param:"value"}

请注意键名称的引号。但如果没有失败的 JSON,很难说代码中真正的问题是什么。

关于javascript - 随机错误 "Unexpected token in JSON",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38443415/

相关文章:

angularjs - 将变量传递给循环中的 promise

javascript - 为什么我在 ajax 响应开始时得到 �?

javascript - 当 useCallback 缺乏依赖项时,React useState 和 useCallback hook 如何工作

javascript - 立即检测输入[type ="text"]的变化

javascript - 将 cookie 设置为视频播放几秒后显示的 div?

javascript - 单击链接时将 AngularJS $scope 变量传递给新 Controller

javascript - ng-repeat 被注释并且不显示 JSON 对象的结果

Javascript覆盖 parent 的get方法

c# - 如何在转换为 json 时格式化对象中仅为字符串的属性?

python - 如何从 Python 中的嵌套字典打印多个值