Parsowanie JSON przy użyciu C [zamknięte]

82

Próbuję znaleźć dobry sposób na parsowanie JSON w C. Naprawdę nie potrzebuję ogromnej biblioteki ani niczego innego, wolałbym mieć coś małego i lekkiego z absolutnym minimum funkcji, ale dobrą dokumentacją.

Czy ktoś ma coś, na co może mi wskazać?

dshipper
źródło
5
Czy używasz dystrybucji Linuksa?
Nick,
json-glib
Nick,
Czy biblioteka Objective-C będzie działać? Używam TouchJson na moim Macu, gdy w obj-c jest bardzo łatwy w użyciu i mały.
Nick,
Kiedy mówisz „absolutne minimum”, jak minimalne możesz w rzeczywistości iść? Niektórzy będą obsługiwać różne kodowania Unicode, niektórzy po prostu UTF-8, a niektóre tylko zwrócić uwagę znaków ASCII „Format”, takich jak {, [, ], }, ,, ", i backslash. Mogą, ale nie muszą, pozostawić przełączanie sekwencji ucieczki Unicode Tobie, mogą pozostawić Tobie sprawdzenie, czy liczby mieszczą się w dopuszczalnym zakresie Unicode itp. Następnie istnieje zasadnicza różnica między analizowaniem dowolnego JSON na drzewa a znanym JSON w C struktury.
hippietrail
Powiązane: Parse JSON w ANSI C [zamknięte]
hippietrail

Odpowiedzi:

74

Json nie jest ogromnym językiem na początek, więc biblioteki dla niego prawdopodobnie będą mniejsze (przynajmniej niż biblioteki Xml).

Istnieje całe mnóstwo C bibliotek połączone w json.org . Może któryś z nich dobrze Ci się sprawdzi.

Merlyn Morgan-Graham
źródło
3
Tak dzięki za odpowiedź! Przejrzałem kilka z nich i były one dość słabo udokumentowane / utrzymane. Pomyślałem, że spróbuję tutaj, zanim cierpię na integrację .... :)
dshipper
2
@dshipper: sourceforge.net/projects/cjson wygląda nieco obiecująco, biorąc pod uwagę Twoje wymagania. Osobiście nie korzystałem z żadnej z tych bibliotek, więc nie mogę jej polecić. Sugestie dotyczące jednej biblioteki są w każdym razie tylko opinią, a nie ostateczną odpowiedzią :)
Merlyn Morgan-Graham
5
@dshipper: Mam dobre doświadczenia z jansson, który jest lekki i dobrze udokumentowany. digip.org/jansson/doc/2.1
Dietrich Epp
1
@Dietrich, dshipper: Właśnie spojrzałem na Janssona. Zgadzam się, że jest dobrze udokumentowany i dość mały i wygląda na to, że ma dobry zestaw testów. Prawdopodobnie pasowałby również do twoich wymagań. Ale prawdopodobnie istnieje kilka bibliotek, które by działały. Radziłbym ci jak najlepiej wyodrębnić swoje zależności Json, wypróbować kilka bibliotek i zobaczyć, co sprawia ci najmniej żalu :)
Merlyn Morgan-Graham
Więc @dshipper, poszedłeś na sourceforge.net/projects/cjson, czy co?
Mawg mówi, że przywróć Monikę
37

cJSON ma przyzwoite API i jest mały (2 pliki, ~ 700 linii). Wiele innych parserów JSON, które oglądałem na początku, było ogromnych ... Chcę tylko przeanalizować trochę JSON.

Edycja: przez lata wprowadziliśmy kilka ulepszeń w cJSON.

NateS
źródło
10

Jsmn jest dość minimalistyczny i ma tylko dwie funkcje do pracy.

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

Prabhpreet
źródło
Jedną z wad jsmn jest to, że nie obsługuje sekwencji ucieczki Unicode. W jego źródle zobaczysz: /* Allows escaped symbol \uXXXX */... case 'u':.../* TODO */
hippietrail
14
Poza tym wszystko, co robi, to daje tokeny, powodzenia w nadawaniu sensu danym. Wygląda na najmniejszą, wydajną rzecz, jaką możesz zrobić, ale też niewiele robi.
NateS
Najwyraźniej naprawili swoje „TODO” dla symboli Unicode.
aviggiano,
9

NXJSON to w pełni funkcjonalny, ale bardzo mały (~ 400 linii kodu) parser JSON, który ma łatwe w użyciu API:

Yaroslav Stavnichiy
źródło
Ponieważ wydajesz się być twórcą NXJSON, może mógłbyś skomentować, jak wypada on w porównaniu z cJSON lub innymi opcjami?
Matt
5
Proste rzeczy robione w prosty sposób - to główna różnica między NXJSON a większością innych parserów. cJSON jest również prosty, ale oprócz parsera json zawiera również konstruktor json, a także serializator. cJSON potrzebuje więcej pamięci, ponieważ powiela wszystkie ciągi, podczas gdy NXJSON wykonuje wszystkie operacje na miejscu, niszcząc oryginalną zawartość. W zależności od zadania te różnice można uznać za zalety lub wady. NXJSON obsługuje również komentarze, co jest dobre do analizowania plików konfiguracyjnych.
Yaroslav Stavnichiy
9

Możesz rzucić okiem na Jansson

Witryna internetowa stwierdza, co następuje: Jansson to biblioteka C do kodowania, dekodowania i manipulowania danymi JSON. Zawiera:

  • Prosty i intuicyjny interfejs API i model danych
  • Może zarówno kodować, jak i dekodować z formatu JSON
  • Kompleksowa dokumentacja
  • Brak zależności od innych bibliotek
  • Pełna obsługa Unicode (UTF-8)
  • Obszerny zestaw testów
TantrajJa
źródło
1
Bezpośredni link do Github: github.com/akheron/jansson
Ray Hulha
Kusiło mnie, aby go użyć jsmnze względu na jego szybkość [1], ale nie obsługuje kodowania. Ponadto Jansson jest naprawdę łatwy w użyciu. --- [1] translate.google.it/…
Marco Sulla
OjC jest szybki i obsługuje kodowanie. github.com/ohler55/ojc
Peter Ohler
Jansson jest moim miejscem do analizowania JSON w C
Kenneth Wilke
8

Użyłem JSON-C do projektu pracy i poleciłbym go. Lekki i wydany z otwartą licencją.

Dokumentacja jest dołączona do dystrybucji. Zasadniczo masz *_addfunkcje do tworzenia obiektów JSON, równoważne *_putfunkcje do zwalniania ich pamięci oraz funkcje narzędziowe, które konwertują typy i obiekty wyjściowe w reprezentację ciągu.

Licencja umożliwia włączenie do projektu. Użyliśmy go w ten sposób, kompilując JSON-C jako bibliotekę statyczną, która jest połączona z główną kompilacją. W ten sposób nie musimy martwić się o zależności (poza instalacją Xcode).

JSON-C również zbudował dla nas bez żadnych incydentów pod OS X (x86 Intel) i Linux (x86 Intel). Jeśli Twój projekt musi być przenośny, jest to dobry początek.

Alex Reynolds
źródło
6

Czy potrzebujesz analizować dowolne struktury JSON, czy tylko dane specyficzne dla Twojej aplikacji. Jeśli to drugie, możesz sprawić, że będzie dużo lżejszy i bardziej wydajny, ponieważ nie musisz generować żadnej struktury tablicy skrótów / mapy mapującej klucze JSON na wartości; zamiast tego możesz po prostu przechowywać dane bezpośrednio w polach strukturalnych lub czymkolwiek.

R .. GitHub PRZESTAŃ POMÓC LODOWI
źródło
2
Jest to bardzo ważna kwestia podczas używania JSON z językami niedynamicznymi, takimi jak C. Ale to nie jest odpowiedź, więc powinien być komentarzem do pytania OP.
hippietrail
+1 za kreatywne myślenie! Jak by to jednak działało? Czy to nie może nadal korzystać ze szczególnie lekkiej biblioteki? Parsowanie do pól struktur nadal brzmi jak sporo pracy.
CL22