Boa Tarde a todos, estou com um problema que não encontro solução na internet, por isso tive que apelar para este forum, quero mostrar em um tela de lcd cotações atualizadas de ações da bolsa, gosto de usar uma ferramenta do yahoo chamada YQL (yahoo Query linguage) que me devolve um json bastante complexo que contem json com arrays de json, tentei fazer com a própria biblioteca que o yahoo mostra em sua documentação <aJSON.h> porem a mesma não oferece em sua documentação como usar arrays de json, a mesma trata apenas de como usar arrays, também tentei a biblioteca encontrada disponível para baixar na própria IDE <ArduinoJson.h> novamente sem sucesso. vou disponibilizar o json devolvido aqui para terem ideia, a parte que preciso extrair é: query.results.quote[x].LastTradePriceOnly.

{

  • "query":{
    • "count":4,
    • "created":"2017-05-11T18:57:34Z",
    • "lang":"en-US",
    • "diagnostics":
    • "results":{
      • "quote":[
        1. {
          • "symbol":"YHOO",
          • "AverageDailyVolume":"6696420",
          • "Change":"+0.12",
          • "DaysLow":"49.14",
          • "DaysHigh":"49.56",
          • "YearLow":"35.05",
          • "YearHigh":"49.67",
          • "MarketCapitalization":"47.70B",
          • "LastTradePriceOnly":"49.52",
          • "DaysRange":"49.14 - 49.56",
          • "Name":"Yahoo! Inc.",
          • "Symbol":"YHOO",
          • "Volume":"2072218",
          • "StockExchange":"NMS"
          },
        2. {
          • "symbol":"AAPL",
          • "AverageDailyVolume":"24352100",
          • "Change":"-0.805",
          • "DaysLow":"152.310",
          • "DaysHigh":"153.560",
          • "YearLow":"89.470",
          • "YearHigh":"154.880",
          • "MarketCapitalization":"794.88B",
          • "LastTradePriceOnly":"152.455",
          • "DaysRange":"152.310 - 153.560",
          • "Name":"Apple Inc.",
          • "Symbol":"AAPL",
          • "Volume":"10439447",
          • "StockExchange":"NMS"
          },
        3. {
          • "symbol":"GOOG",
          • "AverageDailyVolume":"1419470",
          • "Change":"-3.04",
          • "DaysLow":"923.03",
          • "DaysHigh":"927.76",
          • "YearLow":"663.28",
          • "YearHigh":"937.50",
          • "MarketCapitalization":"640.38B",
          • "LastTradePriceOnly":"925.74",
          • "DaysRange":"923.03 - 927.76",
          • "Name":"Alphabet Inc.",
          • "Symbol":"GOOG",
          • "Volume":"254352",
          • "StockExchange":"NMS"
          },
        4. {
          • "symbol":"MSFT",
          • "AverageDailyVolume":"21854700",
          • "Change":"-1.035",
          • "DaysLow":"68.120",
          • "DaysHigh":"68.730",
          • "YearLow":"48.035",
          • "YearHigh":"69.710",
          • "MarketCapitalization":"527.12B",
          • "LastTradePriceOnly":"68.275",
          • "DaysRange":"68.120 - 68.730",
          • "Name":"Microsoft Corporation",
          • "Symbol":"MSFT",
          • "Volume":"555345",
          • "StockExchange":"NMS"
          }
        ]
      }
    }

} 

se eu pedir apenas resultado de uma ação o seguinte código funciona porem quando coloco arrays de json não  funciona.

char* parseJson(char *jsonString)
{
char* value;


aJsonObject* root = aJson.parse(jsonString);

if (root != NULL) {
Serial.println("Parsed successfully 1 " );
aJsonObject* query = aJson.getObjectItem(root, "query");

if (query != NULL) {
Serial.println("Parsed successfully 2 " );
aJsonObject* results = aJson.getObjectItem(query, "results");

if (results != NULL) {
Serial.println("Parsed successfully 3 " );
aJsonObject* item = aJson.getObjectItem(results, "quote");

aJsonObject* acao = aJson.getObjectItem(item, "LastTradePriceOnly");
Serial.println("Parsed successfully 4 " );

Serial.println(acao->valuestring);
// if (title != NULL) {
//Serial.println("Parsed successfully 5 " );
// value = title->valuestring;
// }

}
}
}

Exibições: 472

Responder esta

Respostas a este tópico

Resolvi o problema tratando o json como string

#include <ArduinoJson.h>

#include <aJSON.h>
#include <MemoryFree.h>
#include <LiquidCrystal.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <Ethernet.h>


LiquidCrystal lcd(39, 41, 37, 35, 33, 31);
// function definitions
int maxi = 4; // representara o numero de acoes pesquisadas(4 numero de acoes pesquisadas)
int posiarray = 0;//representara a posicao do array
int posicao = 0;// representara a posicao do char no json
String acoes[4];//guardara o nome da acao(nao deve ter menos arrays que a quantidade de acoes pesquisadas)
String cotacoes[4];//guaradara a posica da acao(nao deve ter menos arrays que a quantidade de acoes pesquisadas)
void MakeHTTPRequest();
String URLEncode(const char * msg);
String parseJson( String jsonString);
String parsej(String JsonString, String stringfind, int ini);
void printFreeMemory(char* message);
int var =0;
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
IPAddress ip(192,168,0,150);

// initialize the EthernetClient instance:
EthernetClient client;

// YQL related
const char serverName[] = "query.yahooapis.com"; // Yahoo YQL URL
const char URL[] = "GET /v1/public/yql?q=";
const char YQLQuery[] = "select * from yahoo.finance.quote where symbol in ('YHOO','AAPL','GOOG','MSFT')";
const char Format[] = "&format=json&env=";
const char Env[] = "store://datatables.org/alltableswithkeys";
const char HTTPVersion[]=" HTTP/1.1";
const char HOST[] = "HOST: query.yahooapis.com";

// Status related
String jsonResponse = "";
boolean jsonStarted = false;
boolean responseParsed = false;
short bracesCount = 0;
int cont = 0;
void setup()
{

lcd.begin(16, 2);
lcd.print("Carregando");
// Open serial communications and wait for port to open:
Serial.begin(9600);
// while (!Serial) {
// ; // wait for serial port to connect. Needed for Leonardo only
// }
pinMode(43,INPUT);

printFreeMemory("Before Connection");

// attempt a DHCP connection:
Serial.println(F("Attempting to get an IP address using DHCP:"));
if (!Ethernet.begin(mac)) {
// if DHCP fails, start with a hard-coded address:
Serial.println(F("failed to get an IP address using DHCP, trying manually"));
Ethernet.begin(mac, ip);
}

Serial.print(F("My IP:"));
Serial.println(Ethernet.localIP());

// connect to YQL Server
MakeHTTPRequest();

printFreeMemory("After Setup");
}

void loop()
{
bool flag = false;

if(flag == false){
if (client.connected()) {
if (client.available()) {

// read incoming bytes:
char inChar = client.read();

Serial.print(inChar);
// Extract only the JSON part of the response
if (!jsonStarted && inChar == '{') {
jsonStarted = true;
}

if (inChar == '{') {
bracesCount++;
}

if (inChar == '}') {
bracesCount--;
}

if (jsonStarted ) {
jsonResponse += inChar;
}

if (bracesCount == 0) {
jsonStarted = false;
}
} else {
if (!responseParsed && jsonResponse.length() > 0) {
printFreeMemory("Before parsing");

// We have the json response, let's start to parse it
jsonResponse.trim();


char* jsonString = (char*) malloc(sizeof(char)*(jsonResponse.length()+1));
jsonResponse.toCharArray(jsonString, jsonResponse.length() + 1);

int i=0;
for(i=0;i<maxi;i++){
String value = parsej(jsonString,"LastTradePriceOnly",posicao);
String nome = parsej(jsonString,"Name",posicao);
acoes[i]=nome;
cotacoes[i]=value;
}


Serial.println(cotacoes[posiarray]);
lcd.setCursor(0, 0);
lcd.clear();
lcd.print(acoes[posiarray]);
lcd.setCursor(0, 1);
lcd.print("R$");
lcd.print(cotacoes[posiarray]);
posiarray++;

responseParsed = true;

// We are done. Let's close the client request
client.stop();
}
}
}flag = true;}

if( digitalRead(43) == 1){
while(digitalRead(43) == 1)
Serial.println(posiarray);
Serial.println(acoes[posiarray]);
Serial.println(cotacoes[posiarray]);
lcd.setCursor(0, 0);
lcd.clear();
lcd.print(acoes[posiarray]);
lcd.setCursor(0, 1);
lcd.print("R$");
lcd.print(cotacoes[posiarray]);

if(posiarray == (maxi-1)){posiarray=0;}else{posiarray++;}
}

}


// * Make HTTP Request to the server

void MakeHTTPRequest()
{
// attempt to connect
Serial.println(F("Connecting to server..."));

if (client.connect(serverName, 80)) {
Serial.println(F("Making HTTP request..."));
// make HTTP GET request to YQL:
client.print(URL);
client.print(URLEncode(YQLQuery));
client.print(Format);
client.print(URLEncode(Env));
client.println(HTTPVersion);
client.println(HOST);
client.println();
}
}


// * URL Encode a string.

// Based on http://www.icosaedro.it/apache/urlencode.c


String URLEncode(const char* msg)
{
const char *hex = "0123456789abcdef";
String encodedMsg = "";

while (*msg!='\0'){
if( ('a' <= *msg && *msg <= 'z')
|| ('A' <= *msg && *msg <= 'Z')
|| ('0' <= *msg && *msg <= '9') ) {
encodedMsg += *msg;
} else {
encodedMsg += '%';
encodedMsg += hex[*msg >> 4];
encodedMsg += hex[*msg & 15];
}
msg++;
}
return encodedMsg;
}
String parsej(String JsonString, String stringfind, int ini){

String result = "";
int i=0;
String json = JsonString;

int inicio =json.indexOf(stringfind,ini) +3 +stringfind.length();
int fim = json.indexOf('"',inicio);
int quan = fim - inicio;
posicao = fim;
for(i= 0;i<quan;i++){

result+=json.charAt(inicio+i);

}
Serial.println("stringfind:");
Serial.println(stringfind);
Serial.println("inicio:");
Serial.println(inicio);
Serial.println("posicao:");
Serial.println(posicao);


return result;
}

// Parse the JSON String. Uses aJson library

// * Refer to http://hardwarefun.com/tutorials/parsing-json-in-arduino

String parseJson(String jsonString)
{

String value;
Serial.println("printei isso:");


value = parsej(jsonString,"LastTradePriceOnly",0);
/* aJsonObject* root = aJson.parse(jsonString);

if (root != NULL) {
Serial.println("Parsed successfully 1 " );
aJsonObject* query = aJson.getObjectItem(root, "query");

if (query != NULL) {
Serial.println("Parsed successfully 2 " );
aJsonObject* results = aJson.getObjectItem(query, "results");

if (results != NULL) {
Serial.println("Parsed successfully 3 " );
aJsonObject* item = aJson.getObjectItem(results, "quote");

aJsonObject* acao = aJson.getObjectItem(item, "LastTradePriceOnly");
Serial.println("Parsed successfully 4 " );

Serial.println(acao->valuestring);
// if (title != NULL) {
//Serial.println("Parsed successfully 5 " );
// value = title->valuestring;
// }

}
}
}*/

return value;

}


//* Print the Free memory along with a message in the Serial window

// * Uses MemoryFree library - https://github.com/sudar/MemoryFree

void printFreeMemory(char* message)
{
Serial.print(message);
Serial.print(":\t");
Serial.println(getFreeMemory());
}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço