Go Down

Topic: Problema con JSON (Read 443 times) previous topic - next topic

salvatore32

Salve a tutti, pongo subito il mio quesito.

Ho il seguente array di char:

  char MSG[]= "{\"cipolle\":\"patate\",\"popolo\":11133,\"type\":70}";


Al posto di 11133, vorrei inserire una variabile. Mi spiego meglio. Inizializzo una variabile, ad esempio

int a=11133;

Come posso inserire la variabile dentro questo array? Grazie e mi scuso se la domanda è banale.

ORSO2001

ciao salvatore32,

vai a presentarti nell'apposita sezione (GENERALE-> presentazione)...poi vediamo cosa fare.

gpb01

#2
Jul 12, 2018, 09:31 pm Last Edit: Jul 12, 2018, 09:31 pm by gpb01
>salvatore32: come detto da "ORSO2001", essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)

Guglielmo
Search is Your friend ... or I am Your enemy !

salvatore32

Fatto, adesso spero ci sia qualcuno in grado di aiutarmi.

gpb01

#4
Jul 13, 2018, 10:05 am Last Edit: Jul 13, 2018, 10:09 am by gpb01
La soluzione si trova nelle funzioni che trovi in <string.h> o in <stdio.h> che fanno parte di AVR libc, libreria SEMPRE inclusa automaticamente e sempre disponibile.

Ti basta prendere la parte che tieni fissa, ovvero {\"cipolle\":\"patate\",\"popolo\": ed usare la strcat() per aggiungerci il valore, convertito in stringa, della tua variabile, facendo seguire il tutto da ,\"type\":70}.

Altro metodo, più semplice, ma più pesante come occupazione di memoria, è usare la sprintf() che invece si trova in <stdio.h> e che ti permette di comporre la stringa come vuoi (per la sintassi ti consiglio di fare una ricerca su Google dato che NON è proprio chiarissima).

Guglielmo

P.S.: Comunque il titolo del thread è furoviante ... dalla tua domanda risulta infatti che non stiamo parlando di un problema di creazione di un JSON (con le apposite librerie), ma della costruzione di una stringa con due parti fisse e una variabile ...
Search is Your friend ... or I am Your enemy !

salvatore32

Utilizzando questo esempio per convertire un numero in stringa: https://www.arduino.cc/en/Reference.StringConstructor , il risultato non cambia. Dove sbaglio?

gpb01

#6
Jul 13, 2018, 10:37 am Last Edit: Jul 13, 2018, 10:40 am by gpb01
Cortesemnete DIMENTICA la classe String() ...

... NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!!   :smiley-evil:

Impara ad usare bene le stringhe classiche del C ... ovvero semplici array di char terminati dal carattere null (0x00), così come inizialmente hai impostato il programma e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc .

Guglielmo

P.S.: Se poi vuoi usare per forza la classe String (... a tuo rischio e pericolo :D :D :D) ... allora devi modificare il tuo programma visto che, al momento, tu stai usando le stringhe classiche del 'C' !
Search is Your friend ... or I am Your enemy !

salvatore32

Andiamo per punti:

- Utilizzando la funzione : String ID = String(13);
  Avviene la conversione in stringa?

- Se la conversione a stringa avviene, adesso la variabile ID, sarà una stringa contenente il valore 13.

- Utilizzando strcat(ID), essendo ID adesso una stringa, dovrebbe funzionare? (Nell'allegato precedente avevo inserito la schermata col codice e l'output).

La mia domanda è: Il fatto che mi stampi strcat(ID) e non il valore 13, è un problema riguardante la conversione in stringa o non ha nulla a che fare con ciò?

Inizialmente vorrei che funzionasse, per le migliorie successive riguardo l'allocazione dinamica della memoria, ci penserò dopo.

salvatore32

#8
Jul 13, 2018, 11:08 am Last Edit: Jul 13, 2018, 11:08 am by salvatore32
Tuttavia, utilizzando la funzione sprintf, credo di aver risolto il problema. Questo è ciò che ho scritto, ed ho l'output desiderato. Se a qualcuno potesse servire:

int a=10;

 
 StaticJsonBuffer<200> jsonBuffer;

 char MSG[150];
 sprintf(MSG,"{\"cipolle\":\"patate\",\"popolo\",%d,\"type\":70}",a);

 String msg3(MSG);

 Serial.printf("\nSto inviando: %s\n", msg3.c_str());

gpb01

Poi mi spiegherai perché continui a usare la classe String() visto che sai usare le vere stringhe del 'C' ...
... bah, contento tu ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

ORSO2001

ciao...ma tu stai manipolando la stringa come stringa JSON anche in arduino (utilizzo dell'apposita libreria) oppure cosa?

se è il primo caso (vera stringa JSON) su arduino ...supponiamo che il tuo oggetto JSON sia root al quale hai passato la tua stringa MSG per assegnare un valore a "popolo" che in origine ha valore 11133 si dovrebbe fare:

Code: [Select]
int a = 10000;
root["popolo"] = a;


diversamente se tu passi da arduino la sola stringa e questa viene manipolata come JSON da altri device...ok

SukkoPera

Io sarò monotono, ma suggerisco sempre questo: http://arduiniana.org/libraries/pstring/.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

docdoc

Tuttavia, utilizzando la funzione sprintf, credo di aver risolto il problema.
Dunque, proviamo a capire cosa fai:

Code: [Select]
// Diciamo il nuovo valore, ok.
int a=10;

// Hai un buffer Json, che poi non usi: a che serve?
StaticJsonBuffer<200> jsonBuffer;

// Definisci una stringa C da 150 byte
char MSG[150];
// La riempi con la tua stringa, ed è ok
sprintf(MSG,"{\"cipolle\":\"patate\",\"popolo\",%d,\"type\":70}",a);

// converti la stringa C in classe String (??)
String msg3(MSG);

// Ariprendi la String e la ariconverti in stringa C ????
// E poi che è Serial.printf()? Hai modificato la print()?
Serial.printf("\nSto inviando: %s\n", msg3.c_str());

Scusa ma che senso ha tutto ciò?

Basterebbe una cosa del genere:

Code: [Select]
int a=10;
char MSG[150];
sprintf(MSG,"{\"cipolle\":\"patate\",\"popolo\",%d,\"type\":70}",a);
Serial.print("Sto inviando: ");
Serial.println(MSG);


o no?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

salvatore32

- Rispondendo ad ORSO2001:

Sostanzialmente invio un messaggio tramite WiFi tramite una funzione della libreria che sto utilizzando. L'invio del messaggio lo eseguo tramite questo comando:

  mesh.sendBroadcast(msg);

dove msg è sempre una stringa, per questo effettuo la conversione. (A dir la verità non ho provato ad inserire direttamente l'array di char, in quanto non so se è la stessa cosa).

In ricezione, estraggo gli oggetti tramite la libreria JSON, parte che è stata omessa in quanto già ho compreso il funzionamento e non ho problemi.

- Rispondendo a docdoc :

Il Json buffer lo utilizzo dopo. Per quanto riguarda la riconversione in stringa, sicuramente non ho ben chiare le idee. Vedendo gli esempi per inviare i messaggi con la libreria che sto utilizzando, essi venivano sempre convertiti con String ed il messaggio inviato come stringa. Ripeto, non ho provato ad inviare direttamente la variabile array di char.

Per quanto riguarda Serial.printf(), non ti so dire, solitamente utilizzo questo, non so cosa cambia rispetto a Serial.print().

docdoc

#14
Jul 13, 2018, 02:48 pm Last Edit: Jul 13, 2018, 02:48 pm by docdoc
Per quanto riguarda la riconversione in stringa, sicuramente non ho ben chiare le idee. Vedendo gli esempi per inviare i messaggi con la libreria che sto utilizzando, essi venivano sempre convertiti con String ed il messaggio inviato come stringa. Ripeto, non ho provato ad inviare direttamente la variabile array di char.
Se la funzione che usi di quella libreria (quale?) accetta vari tipi di parametro lo puoi vedere dal suo file ".h". Se non sai come verificare, dicci esattamente che libreria usi o posta il codice del file .h

Quote
Per quanto riguarda Serial.printf(), non ti so dire, solitamente utilizzo questo, non so cosa cambia rispetto a Serial.print().
Normalmente non c'è la printf per la seriale hardware, quindi tu (o "qualcosa" che hai nel tuo progetto) hai aggiunto la funzione printf() alla classe HardwareSerial. E' comoda se c'è, ma se non sai cosa abbia fatto questo, mi preoccupa il tuo grado di controllo del progetto... ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up