json-c array Sortieren
-
Hallo zusammen,
ich möchte, meine JSON Inhalt in einer array nach einem Bestimmten Wert Sortieren lassen,
nutze die Bibliothek json-c und es gib unter:https://github.com/rbtylee/tutorial-jsonc/blob/master/tutorial/sort.md
ein Beispiel, für eine einfache Sortierung, meine JSON sieht aber so aus:
[ { "POS": 0, "ID": "2545327648", "UPDATE": 1755892547, "FILE_SIZE": "34428674", "IS_ACTIV": "false" }, { "POS": 4, "ID": "1559212036", "UPDATE": 1745501111, "FILE_SIZE": "525685", "IS_ACTIV": "false" }, { "POS": 2, "ID": "2796703209", "UPDATE": 1720644377, "FILE_SIZE": "1174863", "IS_ACTIV": "true" }, { "POS": 1, "ID": "2291785308", "UPDATE": 1756819745, "FILE_SIZE": "51587989", "IS_ACTIV": "false" }, { "POS": 3, "ID": "2116151222", "UPDATE": 1755866671, "FILE_SIZE": "122657596", "IS_ACTIV": "ture" } ]
und möchte das ganze nach POS aufsteigend Sortieren lassen.
Sorry habe aber absolut keinen Ansatzplan, wie ich das umsetzte.
Gruß
-
Dafür benötigst du dann die Funktion json_object_object_get, um ein Unterelement (z.B.
"POS"
) zu lesen.
Rufe diese dann zuerst anstatt vonjson_object_get_int
oderjson_object_get_string
(aus deinem gezeigten Link) auf und vergleiche dann dessen Werte (entsprechend des Datentyps).PS: In deinem letzten Element steht
"IS_ACTIV": "ture"
(anstatt"true"
;- )
Und im englischen heißt esactive
(mite
).
-
Hallo,
vielen dank für die kleinen Hinweise der Schreibfehler, leider komme ich so nicht weiter, hier mal mein Code aber Verstehe nicht, wie ich dies Sortieren kann:
JSON:
{ "LIST": [ { "POS": 0, "ID": "2545327648", "UPDATE": 1755892547, "FILE_SIZE": "34428674", "IS_ACTIVE": "false" }, { "POS": 4, "ID": "1559212036", "UPDATE": 1745501111, "FILE_SIZE": "525685", "IS_ACTIVE": "false" }, { "POS": 2, "ID": "2796703209", "UPDATE": 1720644377, "FILE_SIZE": "1174863", "IS_ACTIVE": "ture" }, { "POS": 1, "ID": "2291785308", "UPDATE": 1756819745, "FILE_SIZE": "51587989", "IS_ACTIVE": "false" }, { "POS": 3, "ID": "2116151222", "UPDATE": 1755866671, "FILE_SIZE": "122657596", "IS_ACTIVE": "ture" } ] }
C:
#include <stdio.h> #include <json-c/json.h> int main(int argc, char const *argv[]) { json_object *JSON_FILE = json_object_from_file("./Config.json"); json_object *LIST = json_object_object_get(JSON_FILE, "LIST"); size_t LIST_Len = json_object_array_length(LIST); for (int a = 0; a < LIST_Len; a++) { json_object *OBJ = json_object_array_get_idx(LIST, a); json_object *ID = json_object_object_get(OBJ, "ID"); json_object *POS = json_object_object_get(OBJ, "POS"); printf("\t[%d] = %s (%s)\n", (int)a + 1, json_object_get_string(ID), json_object_get_string(POS)); } return 0; }
Ausgabe:
[1] = 2545327648 (0) [2] = 1559212036 (4) [3] = 2796703209 (2) [4] = 2291785308 (1) [5] = 2116151222 (3)
Ich weiß leider nicht wie ich dies jetzt nach POS Sortieren kann.
Gruß
-
Du hast doch selber den Link auf das Sortier-Tutorial gepostet.
Dort ist doch ein weiterer Link auf das Beispielprogramm test1.c (welches du auch mal einfach bei dir lokal ausführen kannst).Und in der Sortier(vergleichs)funktion
sort_fn
, welche du dann für dein Programm übernimmst, änderst du entsprechend den Code (wie von mir oben beschrieben) ab. Und das Sortieren selbst wird mit der Funktionjson_object_array_sort(...)
ausgeführt (wie auch im Tutorial direkt als erstes beschrieben).PS: Du hast jetzt immer noch den ersten Schreibfehler in deiner JSON-Datei drin.
-
@Th69 sagte in json-c array Sortieren:
PS: Du hast jetzt immer noch den ersten Schreibfehler in deiner JSON-Datei drin.
Hab jetzt mal mit 0 und 1 getauscht
Leider kann ich deine Beschreibung nicht ganz folgen, habe jetzt Versucht, dies so Umzusetzten:
#include <stdio.h> #include <json-c/json.h> #include <string.h> static int sort_fn(const void *j1, const void *j2) { json_object *const *jso1, *const *jso2; int i1, i2; jso1 = (json_object * const *)j1; jso2 = (json_object * const *)j2; if (!*jso1 && !*jso2) return 0; if (!*jso1) return -1; if (!*jso2) return 1; i1 = json_object_get_int(*jso1); i2 = json_object_get_int(*jso2); return i1 - i2; } int main(int argc, char const *argv[]) { json_object *JSON_FILE = json_object_from_file("./Config.json"); json_object *LIST = json_object_object_get(JSON_FILE, "LIST"); json_object_array_sort(LIST, sort_fn); printf("my_array=\n"); for (int i = 0; i < json_object_array_length(LIST); i++) { json_object *obj = json_object_array_get_idx(LIST, i); printf("\t[%d]=%s\n", (int)i, json_object_to_json_string(obj)); } return 0; }
Ausgabe
my_array= [0]={ "POS": 4, "ID": "2545327648", "UPDATE": 1755892547, "FILE_SIZE": "34428674", "IS_ACTIVE": 1 } [1]={ "POS": 0, "ID": "1559212036", "UPDATE": 1745501111, "FILE_SIZE": "525685", "IS_ACTIVE": 1 } [2]={ "POS": 2, "ID": "2796703209", "UPDATE": 1720644377, "FILE_SIZE": "1174863", "IS_ACTIVE": 0 } [3]={ "POS": 1, "ID": "2291785308", "UPDATE": 1756819745, "FILE_SIZE": "51587989", "IS_ACTIVE": 0 } [4]={ "POS": 3, "ID": "2116151222", "UPDATE": 1755866671, "FILE_SIZE": "122657596", "IS_ACTIVE": 1 }
Nach Sortierung sieht das nun nicht wirklich aus, mein alter Kopf qualmt schon
-
Und wo greifst du in der Sortierfunktion jetzt auf
"POS"
zu?
-
@s0pply sagte in json-c array Sortieren:
i1 = json_object_get_int(*jso1);
Wenn ich die Doku mir richtig angeschaut habe, musst du stattdessen:
json_object_object_get_ex
aufrufen, um dir das "POS"-json_object zu holen- auf das Ergebnis davon dann
json_object_get_int
aufrufen.
Also (absolut ungetestet):
const json_object *pos_jso; bool ok = json_object_object_get_ex(*jso1, "POS", &pos_jso); if (!ok) handle_pos_missing(); int i1 = json_object_get_int(pos_jso); // entweder hier testen, ob errno == EINVAL oder vorher feststellen, // ob das wirklich ein int ist - das get_int scheint nach der Doku auch // automatisch doubles zu konvertieren - und es returnt 0, wenn da // was nicht geht - oder mit 0 glücklich werden ;-) ok = json_object_object_get_ex(*jso2, "POS", &pos_jso); if (!ok) handle_pos_missing(); int i2 = json_object_get_int(pos_jso);
-
Das war der entscheidende Tip aber musste:
const json_object *pos_jso;
auf:
struct json_object *pos_jso;
ändern, dass das geht, hatte gestern Abend mir eine Umständliche Lösung gebaut und kam darauf:
#include <stdio.h> #include <json-c/json.h> #include <string.h> #include <stdlib.h> typedef struct { int sn_pos; char sn_id[12]; int sn_update; char sn_file_size[12]; int sn_active; } sort_sn; int sn_sort( const void *left, const void *right ) { const sort_sn *b = ( const sort_sn *)left; const sort_sn *a = ( const sort_sn *)right; if (b->sn_pos < a->sn_pos) { return -1; } else if (a->sn_pos < b->sn_pos) { return 1; } else { return (a->sn_id < b->sn_id) - (b->sn_id < a->sn_id); } } int main(int argc, char const *argv[]) { json_object *JSON_FILE = json_object_from_file("./Config.json"); json_object *LIST = json_object_object_get(JSON_FILE, "LIST"); size_t LIST_Len = json_object_array_length(LIST); sort_sn meineDatenArray[LIST_Len]; for (int a = 0; a < LIST_Len; a++) { json_object *OBJ = json_object_array_get_idx(LIST, a); json_object *ID = json_object_object_get(OBJ, "ID"); json_object *POS = json_object_object_get(OBJ, "POS"); json_object *UPDATE = json_object_object_get(OBJ, "UPDATE"); json_object *FILE_SIZE = json_object_object_get(OBJ, "FILE_SIZE"); json_object *IS_ACTIVE = json_object_object_get(OBJ, "IS_ACTIVE"); meineDatenArray[a].sn_pos = json_object_get_int(POS); strcpy(meineDatenArray[a].sn_id, json_object_get_string(ID)); meineDatenArray[a].sn_update = json_object_get_int(UPDATE); strcpy(meineDatenArray[a].sn_file_size, json_object_get_string(FILE_SIZE)); meineDatenArray[a].sn_active = json_object_get_int(IS_ACTIVE); } qsort(meineDatenArray, LIST_Len, sizeof(sort_sn), sn_sort); for (size_t i = 0; i < LIST_Len; i++) { printf( "%d, %s, %s\n", meineDatenArray[i].sn_pos, meineDatenArray[i].sn_id, meineDatenArray[i].sn_title ); } return 0; }
Natürlich ist der Weg weit aus länger aber war mein Gedanke mal anders anzugehen.
Wie gesagt, Dank dir für die Hilfe