Erro JSON.parse

Estou criando um dataset customizado apartir de um retorno de uma API. Essa API esta construída em PHP. O seu retorno esta vindo no seguinte formato:

[{"codprof":"2359","nomeprof":"WENDEL CORTES MARTINS"}]

Quando eu dou um log.dir dentro do Fluig o retorno aparece assim:

"[{\"codprof\":\"2359\",\"nomeprof\":\"WENDEL CORTES MARTINS\"}]" (não sei porque)

Sendo assim eu não estou conseguindo pegar o valor que eu preciso como por exemplo: json.codprof ou json["codprof"] se eu tento da um JSON.parse da erro. Alguém por favor pode me dar uma luz.

Código Completo:


function createDataset(fields, constraints, sortFields) {
    var dataset = DatasetBuilder.newDataset();
    try{
        var clientService = fluigAPI.getAuthorizeClientService();
        var data = {
            companyId : getValue("WKCompany") + '',
            serviceCode : 'APIRM',                     
            endpoint : '/getProf/?cpf=xxxxxxxxxxxx',
            method : 'get',                                        
        }

        var vo = clientService.invoke(JSON.stringify(data));

        log.info('dataset vo:' + vo.getResult());
        log.dir(vo.getResult());

        if(vo.getResult()== null || vo.getResult().isEmpty()){
            throw new Exception("Retorno está vazio");
        }else{
            dataset.addColumn("codprof");
            dataset.addColumn("nomeprof");

            var json = vo.getResult();

            log.info('dataset json: ' + json);
            log.dir(json);

            json = JSON.parse(json); // Da erro

            dataset.addRow([json.codprof, json.nomeprof]);
        }
    } catch(err) {
        throw new Exception(err);
    }
    return dataset;
}

Qual o Content-Type da resposta? É application/json mesmo? Tente passar headers: { Accept: 'application/json' } no data da sua request para ver se muda alguma coisa

Tentei… mas o erro continua

É no parse mesmo que da o erro? Pq como é um array vc acessaria com json[0].codprof

É assim: quando eu coloco JSON.parse da o seguinte erro no dataset: Erro ao recuperar dados do dataset: Retorno de dataset inválido, verifique sua implementação.
Se o eu tiro o JSON.parse não da erro, só que o retorno da dataset fica com o valor: undefined

Podes colocar dataset.addRow([err.message, '']); no lugar do throw que tem no catch pra vrmos qual a excessao que ele está lançando?

Fiz conforme disse: o que apareceu foi: SyntaxError: Unexpected token: 
Coloquei também um log.dir e no arquivo do log apareceu o seguinte erro: default task-32) No serializer found for class sun.org.mozilla.javascript.internal.UniqueTag and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: sun.org.mozilla.javascript.internal.NativeError[“prototype”]->sun.org.mozilla.javascript.internal.NativeError[“stack”])

Já tive um problema com isto. O retorno vindo do PHP já não veio com json.encode? Se for usado o json encode no php, ele não precisa ser tratado com o JSON.parse. (Estou falando de memória, não estou com o código Javascript com que eu resolvi isto)

Sim. Vem com json encode do PHP, mas eu não sei porque quando eu uso sem JSON.parse o valor da undefined, não mostra os resultado que eu preciso entende. Por isso eu estou tentando usar o JSON.parse para ver se os resultados aparecem, mas colocando JSON.parse da erro. Sem JSON.parse não da erro, mas também não mostra o conteúdo da váriavel

Esse JSON é inválido, por isso o erro. JSON deve começar e finalizar com {}

O que você tem é um array. Tente retornar da api

{ “Vetor”: [{"codprof":"2359","nomeprof":"WENDEL CORTES MARTINS"}] }

E teste para ver se o parse vai funcionar

Obrigada… vou tentar

Avisa se conseguiu

Olá Janilson! Consegui sim… era um problema com a minha API que é em PHP. A mesma esta vindo com um carácter, que ainda não localizei. Tipo deve ter um echo em algum lugar que esta atrapalhando o envio das informações. A API é feita em codeIgniter e será necessário uma revisão para correção. Por hora tratamos os dados retirando esse carácter assim: stringDados = stringDados.substr(1,stringDados.length());