Ver código fonte

:sparkles: Ajout fonction recuperation valeur

Arthur Brandao 6 anos atrás
pai
commit
5d81de9897
3 arquivos alterados com 52 adições e 7 exclusões
  1. 4 0
      json.h
  2. 45 3
      json_parser.c
  3. 3 4
      main.c

+ 4 - 0
json.h

@@ -23,6 +23,7 @@
 /* --- Structure --- */
 typedef struct{
     char* str; //La chaine de carac json
+    int elt; //Le nombre d'element
     char** key; //La position des clef dans la chaine
     char** val; //La position de la valeur 
     int* key_length; //La taille des clefs
@@ -33,6 +34,9 @@ typedef struct{
 /* --- fonctions ---- */
 int json_parse(JsonParser*, char*);
 void clean_json_parser(JsonParser*);
+int get_type(JsonParser*, char*);
+char* get(JsonParser*, char*);
+char* get_index(JsonParser*, int);
 
 #endif /* JSON_H */
 

+ 45 - 3
json_parser.c

@@ -74,7 +74,6 @@ int parse_key(JsonParser* this, int index, char* json) {
         return JSON_ERROR;
     }
     //Setup les infos
-    printf("Key[%d] : %d\n", index, compteur);
     this->key[index] = json - compteur;
     this->key_length[index] = compteur;
     //Sinon retourne ok
@@ -138,7 +137,6 @@ int parse_val(JsonParser* this, int index, char* json){
                 return JSON_ERROR;
             }
             //Setup les infos
-            printf("cpt : %d\n", compteur);
             this->val[index] = json - compteur;
             this->val_length[index] = compteur;
             this->type[index] = JSON_NUMBER;
@@ -170,6 +168,18 @@ int parse_error(JsonParser* this){
     return JSON_ERROR;
 }
 
+int search_index(JsonParser* this, char* key){
+    int length = strlen(key);
+    //Cherche la clef
+    for(int i = 0; i < this->elt; i++){
+        if(strncmp(this->key[i], key, length) == 0){
+            return i;
+        }
+    }
+    //Si rien trouver
+    return JSON_ERROR;
+}
+
 /* --- Fonctions publiques --- */
 
 int json_parse(JsonParser* this, char* json) {
@@ -182,6 +192,7 @@ int json_parse(JsonParser* this, char* json) {
     //Allocation de la taille des tableaux
     this->str = malloc(strlen(json) * sizeof (char));
     strcpy(this->str, json);
+    this->elt = compteur;
     this->key = malloc(compteur * sizeof (char*));
     this->key_length = malloc(compteur * sizeof (int));
     this->val = malloc(compteur * sizeof (char*));
@@ -206,7 +217,6 @@ int json_parse(JsonParser* this, char* json) {
             tmp++;
             while(*tmp == ' ') { tmp++; }
             //Lecture valeur
-            printf("%s\n", tmp);
             if((temp = parse_val(this, compteur, tmp)) == JSON_ERROR){ return parse_error(this); }
             tmp += temp;
             key = true;
@@ -222,6 +232,38 @@ int json_parse(JsonParser* this, char* json) {
     return JSON_OK;
 }
 
+int get_type(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return JSON_ERROR;
+    }
+    return this->type[index];
+}
+
+char* get(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return NULL;
+    }
+    return get_index(this, index);
+}
+
+char* get_index(JsonParser* this, int index){
+    //Index incorrect
+    if(index < 0 || index >= this->elt){
+        return NULL;
+    }
+    //Creation string d'accueil
+    char* val;
+    val = malloc(this->val_length[index] * sizeof(char));
+    //Copie valeur
+    strncpy(val, this->val[index], this->val_length[index]);
+    //Retour
+    return val;
+}
+
 void clean_json_parser(JsonParser* this) {
     free(this->key);
     free(this->key_length);

+ 3 - 4
main.c

@@ -5,17 +5,16 @@
 int main(){
     char str[200];
     char key[100];
-    char val[100];
+    char* val;
     JsonParser json;
     strcpy(str, "{\"name\" : \"Jack\", \"age\": 27, \"test\": true, \"tab\": [1, 2, 3, 4, 5], \"obj\": {\"name\" : \"Jack\", \"age\": 27}, \"age\": 27.8 }");
     int a = json_parse(&json, str);
     printf("\nParse : %d\n", a);
     
-    for(int i = 0; i < 6; i++){
+    for(int i = 0; i < json.elt; i++){
         memset(key, 0, 100);
-        memset(val, 0, 100);
         strncpy(key, json.key[i], json.key_length[i]);
-        strncpy(val, json.val[i], json.val_length[i]);
+        val = get_index(&json, i);
         printf("%s : %s\n", key, val);
         //printf("%d %d\n", json.key_length[i], json.val_length[i]);
     }