Marcos,
Para acessa a propriedade de um json, utilizamos os colchetes, assim como também utilizamos os colchetes para acessar os índices de um array.
Porém, existe alguns pontos em seu código e exemplo que podem estar interferindo no funcionamento correto.
Perceba que o seu json de exemplo, está incorreto, o array presente na propriedade response
está entre aspas
{"response":"[{"iddespesa":3, "observacao":"teste3"}, {"iddespesa":4, "observacao":"teste4"},{"iddespesa":5, "observacao":"teste5"}]"}
Isso fará com que o parser gere um erro, logo a variável oJson
não terá a propriedade response
.
Além disso, você usa a função DecodeUtf8
passando o segundo parâmetro em branco, isso não existe, esse parâmetro não é obrigatório, mas se enviado, deve ser um code-page.
Por ultimo, um parser pode retornar erro, e seu código não verifica isso.
Abaixo um exemplo, usando o seu json de exemplo que vai gerar erro no parser e também o seu json com a remoção das aspas do array, veja que quando o json está correto, o parser não retorna erro e é possível acessar as propriedades do json normalmente:
#include "protheus.ch"
// ----------------------------------------------------------------------
/*/{Protheus.doc} myJson
Exemplo de acesso as propriedades do json
@author Daniel Mendes
@since 09/04/2021
@version 1.0
/*/
// ----------------------------------------------------------------------
user function myJson()
local cStrJson as char
local cParserError as char
local jJson
//JSON com erro na sintaxe
cStrJson := '{"response":"[{"iddespesa":3, "observacao":"teste3"}, {"iddespesa":4, "observacao":"teste4"},{"iddespesa":5, "observacao":"teste5"}]"}'
jJson := JsonObject():New()
cParserError := jJson:fromJson(cStrJson)
if Empty(cParserError)
ConOut(jJson:toJson())
else
ConErr(cParserError)
endif
//JSON correto
cStrJson := '{"response":[{"iddespesa":3, "observacao":"teste3"}, {"iddespesa":4, "observacao":"teste4"},{"iddespesa":5, "observacao":"teste5"}]}'
jJson := JsonObject():New()
cParserError := jJson:fromJson(cStrJson)
if Empty(cParserError)
ConOut(jJson["response"][1]["iddespesa"])
else
ConErr(cParserError)
endif
return
Documentações:
https://tdn.totvs.com/display/tec/DecodeUTF8
https://tdn.totvs.com/display/tec/Classe+JsonObject