2017-03-15 2 views
0

Je développe un logiciel C embarqué qui construit une chaîne JSON avec plusieurs paramètres (chaîne et entier). Pour mon but j'ai utilisé cJSON) à l'avenir j'ai besoin d'analyser complexe JSON).La fonction d'impression cJSON n'ajoute pas de numéro à l'objet

Je construis mon JSON avec ce code:

jsonObject = cJSON_CreateObject(); 

    cJSON_AddNumberToObject(jsonObject, "Version", 1); 

    cJSON_AddStringToObject(jsonObject, "ID", "xyz"); 

    cJSON_AddStringToObject(jsonObject, "Local", "1234"); 

    cJSON_AddNumberToObject(jsonObject, "Type", 1); 

    cJSON_AddStringToObject(jsonObject, "Message", "Hello"); 

Ensuite, j'imprimer le JSON dans un tampon dynamique à l'aide:

cJSON_PrintPreallocated(jsonObject, *jsonMessage, *jsonMessageLen, 0) 

Quand je visualise la jsonMessage sur un terminal, la propriété « Type "n'a pas de valeur.

C'est construit JSON:

{"Version":1,"ID":"xyz","Local":"123","Type":,"Message":"Hello"} 

J'essaie d'utiliser une méthode d'impression différente, par exemple je:

CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) 

Et le JSON est construit correctement. Le problème est que j'ai besoin d'allouer la mémoire par moi-même et de ne pas utiliser cJSON_PrintBuffered. Ceci parce que je ne peux pas utiliser malloc et la fonction libre.

Des suggestions?

Merci

+1

Utilisez [* json-c * qui est solide comme un roc] (https://github.com/json-c/json-c), et simple à utiliser. Cela pourrait être un bug dans la bibliothèque cJSON. –

+0

J'ai besoin d'une libray légère pour le système embarqué. Est-ce? – Federico

+0

Oui c'est, très léger en fait. C'est rapide et largement utilisé. –

Répondre

0

I mis à jour le module cjson et maintenant il fonctionne très bien.

0

C'est assez intéressant, je crois que je sais ce qui se passe. Désolé pour tous les inconvénients que j'ai causés en écrivant ce bogue ...

Dans la version 1.4.0, j'ai introduit un bogue dans cJSON pour que la fonction qui imprime les nombres n'échoue pas quand elle ne peut pas allouer suffisamment de mémoire.

print_number essayera d'allouer 64 octets de mémoire avant d'imprimer un numéro, car il ne sait pas combien d'octets sprintf aura besoin et snprintf ne sont pas disponibles dans la norme ANSI C Votre tampon préaffecté était probablement pas assez longtemps pour que la 64 octets, donc il n'a pas imprimé le numéro un, mais a ensuite continué à imprimer le reste du JSON normalement, car il n'a pas échoué (le bogue).

J'ai ajouté une note au fichier d'en-tête aujourd'hui: Votre pré-alloué doit être de 63 octets plus long que ce que vous attendez de l'impression json si vous voulez éviter toute sorte de situation où cJSON abandonne parce qu'il pense qu'il ne fonctionne pas Pas assez de mémoire dans le tampon préalloué.