Browse Source

:sparkles: Ajout getter valeur du JSON

Arthur Brandao 6 năm trước cách đây
mục cha
commit
e37af9e0d2
3 tập tin đã thay đổi với 134 bổ sung7 xóa
  1. 8 2
      Serveur/json.h
  2. 108 1
      Serveur/json_parser.c
  3. 18 4
      Serveur/main.c

+ 8 - 2
Serveur/json.h

@@ -31,12 +31,18 @@ typedef struct{
     int* type; //Le type des valeurs
 }JsonParser;
 
-/* --- fonctions ---- */
+/* --- Fonctions ---- */
 int json_parse(JsonParser*, char*);
 char* key_index(JsonParser*, int);
 char* get_index(JsonParser*, int);
+int get_pos(JsonParser*, char*);
 int get_type(JsonParser*, char*);
-char* get(JsonParser*, char*);
+char* get_value(JsonParser*, char*);
+double get_number(JsonParser*, char*);
+int get_integer(JsonParser*, char*);
+boolean get_boolean(JsonParser*, char*);
+char* get_array(JsonParser*, char*);
+JsonParser* get_object(JsonParser*, char*);
 void clean_json_parser(JsonParser*);
 
 #endif /* JSON_H */

+ 108 - 1
Serveur/json_parser.c

@@ -260,6 +260,15 @@ char* get_index(JsonParser* this, int index){
     return val;
 }
 
+int get_pos(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return JSON_ERROR;
+    }
+    return index;
+}
+
 int get_type(JsonParser* this, char* key){
     //Recup index
     int index;
@@ -269,15 +278,113 @@ int get_type(JsonParser* this, char* key){
     return this->type[index];
 }
 
-char* get(JsonParser* this, char* key){
+char* get_value(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return NULL;
+    }
+    return get_index(this, index);
+}
+
+double get_number(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return JSON_ERROR;
+    }
+    //Verif type
+    if(this->type[index] != JSON_NUMBER){
+        return JSON_ERROR;
+    }
+    //Recup valeur
+    char* val;
+    val = get_index(this, index);
+    //Cast et retoure
+    double res;
+    res = atof(val);
+    free(val);
+    return res;
+}
+
+int get_integer(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return JSON_ERROR;
+    }
+    //Verif type
+    if(this->type[index] != JSON_NUMBER){
+        return JSON_ERROR;
+    }
+    //Recup valeur
+    char* val;
+    val = get_index(this, index);
+    //Cast et retoure
+    int res;
+    res = atoi(val);
+    free(val);
+    return res;
+}
+
+boolean get_boolean(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return false;
+    }
+    //Verif type
+    if(this->type[index] != JSON_BOOLEAN){
+        return false;
+    }
+    //Recup valeur
+    char* val;
+    val = get_index(this, index);
+    //Cast et retoure
+    if(val[0] == 't'){
+        return true;
+    }
+    return false;
+}
+
+char* get_array(JsonParser* this, char* key){
     //Recup index
     int index;
     if((index = search_index(this, key)) == JSON_ERROR){
         return NULL;
     }
+    //Verif type
+    if(this->type[index] != JSON_ARRAY){
+        return NULL;
+    }
+    //Retour pas de gestion de tableau actuellement
     return get_index(this, index);
 }
 
+JsonParser* get_object(JsonParser* this, char* key){
+    //Recup index
+    int index;
+    if((index = search_index(this, key)) == JSON_ERROR){
+        return NULL;
+    }
+    //Verif type
+    if(this->type[index] != JSON_OBJECT){
+        return NULL;
+    }
+    //Recup valeur
+    char* val;
+    val = get_index(this, index);
+    //Parse
+    JsonParser* json;
+    json = malloc(sizeof(JsonParser));
+    if(json_parse(json, val) == JSON_ERROR){
+        return NULL;
+    }
+    //Retour JSON utilisable
+    free(val);
+    return json;
+}
+
 void clean_json_parser(JsonParser* this) {
     free(this->key);
     free(this->key_length);

+ 18 - 4
Serveur/main.c

@@ -7,16 +7,30 @@ int main(){
     char* key = NULL;
     char* val = NULL;
     JsonParser json;
-    strcpy(str, "{\"name\" : \"Jack\", \"age\": 27, \"test\": true, \"tab\": [1, 2, 3, 4, 5], \"obj\": {\"name\" : \"Jack\", \"age\": 27}, \"age\": 27.8 }");
+    strcpy(str, "{\"name\" : \"Jack\", \"age\": 27, \"test\": true, \"tab\": [1, 2, 3, 4, 5], \"obj\": {\"name\" : \"Jack\", \"age\": 27}, \"nb\": 27.8 }");
+    //Parse
     int a = json_parse(&json, str);
-    printf("\nParse : %d\n", a);
-    
+    printf("Parse : %d\n", a);
+    //Affiche toutes les clefs : valeurs
     for(int i = 0; i < json.elt; i++){
         key = key_index(&json, i);
         val = get_index(&json, i);
         printf("%s : %s\n", key, val);
-        //printf("%d %d\n", json.key_length[i], json.val_length[i]);
     }
+    //Recup un nombre
+    printf("Double : %f %f | Int : %d %d\n", get_number(&json, "age"), get_number(&json, "nb"), get_integer(&json, "age"), get_integer(&json, "nb"));
+    //Recup boolean
+    printf("Bool : %d %d\n", get_boolean(&json, "test"), get_boolean(&json, "tab"));
+    //Recup obj
+    JsonParser* js;
+    js = get_object(&json, "obj");
+    if(js != NULL){
+        int key_i = get_pos(js, "name");
+        printf("JSON : %s %s, age %d\n", key_index(js, key_i), get_value(js, "name"), get_integer(js, "age"));
+    } else {
+        printf("JSON : Error");
+    }
+    //Supprime
     free(key);
     free(val);
     clean_json_parser(&json);