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 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.
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.
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:
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);
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.
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/…
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.
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.
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.
{
,[
,]
,}
,,
,"
, 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.Odpowiedzi:
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.
źródło
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.
źródło
Jsmn jest dość minimalistyczny i ma tylko dwie funkcje do pracy.
http://zserge.bitbucket.org/jsmn.html
źródło
/* Allows escaped symbol \uXXXX */
...case 'u':
.../* TODO */
NXJSON to w pełni funkcjonalny, ale bardzo mały (~ 400 linii kodu) parser JSON, który ma łatwe w użyciu 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);
źródło
Możesz rzucić okiem na Jansson
Witryna internetowa stwierdza, co następuje: Jansson to biblioteka C do kodowania, dekodowania i manipulowania danymi JSON. Zawiera:
źródło
jsmn
ze względu na jego szybkość [1], ale nie obsługuje kodowania. Ponadto Jansson jest naprawdę łatwy w użyciu. --- [1] translate.google.it/…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
*_add
funkcje do tworzenia obiektów JSON, równoważne*_put
funkcje 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.
źródło
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ódło