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