Analysieren von JSON mit C [geschlossen]

82

Ich versuche einen guten Weg zu finden, um JSON in C zu analysieren. Ich brauche wirklich keine große Bibliothek oder so, ich hätte lieber etwas Kleines und Leichtes mit einem Minimum an Funktionen, aber guter Dokumentation.

Hat jemand etwas, auf das er mich hinweisen kann?

dshipper
quelle
5
Verwenden Sie eine Linux-Distribution?
Nick
json-glib
Nick
Würde die Objective-C-Bibliothek funktionieren? Ich benutze TouchJson auf meinem Mac, wenn es in obj-c sehr einfach zu bedienen und klein ist.
Nick
Wenn Sie "absolutes Minimum" sagen, wie minimal können Sie dann tatsächlich gehen? Einige werden verschiedene Unicode - Codierung behandeln, einige nur UTF-8, und einige nur darauf achten das die ASCII „Format Zeichen“ wie {, [, ], }, ,, ", und Backslash. Sie können die Übergabe von Unicode-Escape-Sequenzen Ihnen überlassen oder nicht. Sie können es Ihnen überlassen, zu prüfen, ob die Zahlen innerhalb des zulässigen Unicode-Bereichs liegen usw. Dann besteht der Hauptunterschied zwischen dem Parsen von beliebigem JSON in Bäume und dem bekannten JSON in C. Strukturen.
Hippietrail

Antworten:

73

Json ist anfangs keine große Sprache, daher sind die Bibliotheken wahrscheinlich klein (zumindest nicht die XML-Bibliotheken).

Es gibt eine ganze Tonne C-Bibliotheken, die auf Json.org verlinkt sind . Vielleicht funktioniert einer von ihnen gut für Sie.

Merlyn Morgan-Graham
quelle
3
Ja danke für die Antwort! Ich habe ein paar von ihnen durchgesehen und sie waren ziemlich schlecht dokumentiert / gepflegt. Ich dachte, ich würde es hier versuchen, bevor ich durch die Integration eines litt .... :)
dshipper
2
@dshipper: sourceforge.net/projects/cjson sieht angesichts Ihrer Anforderungen etwas vielversprechend aus. Ich habe persönlich keine dieser Bibliotheken verwendet, daher kann ich keine empfehlen. Vorschläge für eine einzelne Bibliothek sind ohnehin nur eine Meinung und keine endgültige Antwort :)
Merlyn Morgan-Graham
5
@dshipper: Ich habe gute Erfahrungen mit jansson gemacht, das leicht und gut dokumentiert ist. digip.org/jansson/doc/2.1
Dietrich Epp
1
@Dietrich, dshipper: Ich habe gerade Jansson angeschaut. Ich bin damit einverstanden, dass es gut dokumentiert und recht klein ist und anscheinend eine gute Testsuite hat. Es würde wahrscheinlich auch Ihren Anforderungen entsprechen. Aber es gibt wahrscheinlich mehrere Bibliotheken, die funktionieren würden. Ich würde empfehlen, dass Sie Ihre Json-Abhängigkeiten so gut wie möglich abstrahieren, ein paar Bibliotheken ausprobieren und herausfinden, welche Ihnen am wenigsten Kummer bereiten :)
Merlyn Morgan-Graham,
Also, @dshipper, hast du dich für sourceforge.net/projects/cjson entschieden oder was?
Mawg sagt, Monica am
37

cJSON hat eine anständige API und ist klein (2 Dateien, ~ 700 Zeilen). Viele der anderen JSON-Parser, die ich mir zuerst angesehen habe, waren riesig ... Ich möchte nur einige JSON-Parser analysieren.

Bearbeiten: Wir haben im Laufe der Jahre einige Verbesserungen an cJSON vorgenommen.

NateS
quelle
10

Jsmn ist ziemlich minimalistisch und hat nur zwei Funktionen, mit denen man arbeiten kann.

http://zserge.bitbucket.org/jsmn.html

Prabhpreet
quelle
Ein Nachteil von jsmn ist, dass es keine Unicode-Escape-Sequenzen verarbeitet. In seiner Quelle werden Sie sehen: /* Allows escaped symbol \uXXXX */... case 'u':.../* TODO */
Hippietrail
14
Außerdem erhalten Sie nur Token, viel Glück beim Verstehen der Daten. Es sieht aus wie das absolut kleinste und effizienteste, was Sie tun können, aber es macht auch nicht viel.
NateS
Anscheinend haben sie ihr "TODO" für Unicode-Symbole festgelegt.
Aviggiano
9

NXJSON ist ein voll ausgestatteter, aber sehr kleiner JSON-Parser (~ 400 Codezeilen) mit einer benutzerfreundlichen API:

const nx_json* json=nx_json_parse_utf8(code);
printf("hello=%s\n", nx_json_get(json, "hello")->text_value);
const nx_json* arr=nx_json_get(json, "my-array");
int i;
for (i=0; i<arr->length; i++) {
  const nx_json* item=nx_json_item(arr, i);
  printf("arr[%d]=(%d) %ld\n", i, (int)item->type, item->int_value);
}
nx_json_free(json);
Jaroslaw Stavnichiy
quelle
Da Sie der Entwickler von NXJSON zu sein scheinen, könnten Sie vielleicht einen Kommentar zum Vergleich mit cJSON oder anderen Optionen abgeben?
Matt
5
Einfache Dinge auf einfache Weise erledigt - dies ist der Hauptunterschied von NXJSON zu den meisten anderen Parsern. cJSON ist ebenfalls einfach, enthält aber neben dem json-Parser auch den json-Konstruktor sowie den Serializer. cJSON benötigt mehr Speicher, da alle Zeichenfolgen dupliziert werden, während NXJSON alle vorhandenen Manipulationen vornimmt, um den ursprünglichen Inhalt zu zerstören. Abhängig von Ihrer Aufgabe können diese Unterschiede entweder als Vor- oder Nachteile angesehen werden. NXJSON verarbeitet auch Kommentare, was sich gut zum Parsen von Konfigurationsdateien eignet.
Jaroslaw Stavnichiy
9

Sie können sich Jansson ansehen

Auf der Website wird Folgendes angegeben: Jansson ist eine C-Bibliothek zum Codieren, Decodieren und Bearbeiten von JSON-Daten. Es verfügt über:

  • Einfaches und intuitives API- und Datenmodell
  • Kann sowohl in JSON als auch in JSON codieren
  • Umfassende Dokumentation
  • Keine Abhängigkeiten von anderen Bibliotheken
  • Volle Unicode-Unterstützung (UTF-8)
  • Umfangreiche Testsuite
TantrajJa
quelle
1
Direkter Github-Link: github.com/akheron/jansson
Ray Hulha
Ich war versucht, jsmnwegen seiner Geschwindigkeit zu verwenden [1], aber es unterstützt keine Codierung. Darüber hinaus ist Jansson sehr einfach zu bedienen. --- [1] translate.google.it/…
Marco Sulla
OjC ist schnell und unterstützt die Codierung. github.com/ohler55/ojc
Peter Ohler
Jansson ist mein Ziel für das Parsen von JSON in C
Kenneth Wilke
8

Ich habe JSON-C für ein Arbeitsprojekt verwendet und würde es empfehlen. Leicht und wird mit offener Lizenz veröffentlicht.

Die Dokumentation ist in der Distribution enthalten. Grundsätzlich haben Sie *_addFunktionen zum Erstellen von JSON-Objekten, äquivalente *_putFunktionen zum Freigeben ihres Speichers und Dienstprogrammfunktionen, die Typen und Ausgabeobjekte in Zeichenfolgendarstellung konvertieren.

Die Lizenzierung ermöglicht die Aufnahme in Ihr Projekt. Wir haben es auf diese Weise verwendet und JSON-C als statische Bibliothek kompiliert, die mit dem Hauptbuild verknüpft ist. Auf diese Weise müssen wir uns keine Gedanken über Abhängigkeiten machen (außer über die Installation von Xcode).

JSON-C wurde auch für uns unter OS X (x86 Intel) und Linux (x86 Intel) ohne Zwischenfälle erstellt. Wenn Ihr Projekt portabel sein muss, ist dies ein guter Anfang.

Alex Reynolds
quelle
6

Müssen Sie beliebige JSON-Strukturen oder nur Daten analysieren, die für Ihre Anwendung spezifisch sind? In letzterem Fall können Sie es viel einfacher und effizienter gestalten, indem Sie keine Hash-Tabelle / Map-Struktur generieren müssen, die JSON-Schlüssel Werten zuordnet. Sie können die Daten stattdessen einfach direkt in Strukturfeldern oder was auch immer speichern.

R .. GitHub HÖREN SIE AUF, EIS ZU HELFEN
quelle
2
Dies ist ein sehr wichtiger Punkt bei der Verwendung von JSON mit nicht dynamischen Sprachen wie C. Aber es ist keine Antwort, daher sollte es sich wirklich um einen Kommentar zur Frage des OP handeln.
Hippietrail
+1 für kreatives Denken! Wie würde das aber funktionieren? Könnte dies nicht immer noch eine besonders leichte Bibliothek nutzen? Das Parsen in Strukturfelder klingt immer noch nach ziemlich viel Arbeit.
CL22