Разбор JSON с использованием C [закрыто]

82

Я пытаюсь найти хороший способ синтаксического анализа JSON в C. Мне действительно не нужна огромная библиотека или что-то еще, я бы предпочел что-то маленькое и легкое с минимальным набором функций, но с хорошей документацией.

Есть ли у кого-нибудь что-нибудь, на что они могут мне указать?

грузоотправитель
источник
5
Вы используете дистрибутив Linux?
Ник
json-glib
Ник
Будет ли работать библиотека Objective-C? Я использую TouchJson на своем Mac, когда в obj-c он очень простой в использовании и маленький.
Ник
Когда вы говорите «минимум», насколько минимальным вы можете пойти? Некоторые из них будут обрабатывать различные кодировки Unicode, некоторые только UTF-8, а некоторые только обращают внимание на «символы формата» ASCII , такие как {, [, ], }, ,, ", и обратный. Они могут или не могут оставить превращение escape-последовательностей Unicode на ваше усмотрение, они могут оставить вам проверять, находятся ли числа в допустимом диапазоне Unicode и т. Д. Тогда есть основная разница между синтаксическим анализом произвольного JSON на деревья и известного JSON на C структуры.
hippietrail

Ответы:

74

Json - не слишком большой язык для начала, поэтому библиотеки для него, скорее всего, будут небольшими (по крайней мере, чем библиотеки Xml).

Там целая тонна C библиотек связаны в json.org . Может быть, один из них подойдет вам.

Мерлин Морган-Грэм
источник
3
Да спасибо за ответ! Я просмотрел кучу из них, и они были довольно плохо документированы / поддерживались. Я думал, что попробую здесь, пока не мучился с интеграцией одного .... :)
dshipper
2
@dshipper: sourceforge.net/projects/cjson выглядит многообещающе, учитывая ваши требования. Лично я не использовал ни одну из этих библиотек, поэтому рекомендовать не могу. Во всяком случае, предложения по одной библиотеке - это всего лишь мнение, а не окончательный ответ :)
Мерлин Морган-Грэм
5
@dshipper: У меня был хороший опыт работы с jansson, он легкий и хорошо документирован. digip.org/jansson/doc/2.1
Дитрих Эпп
1
@ Дитрих, шкипер: Я только что посмотрел на Янссон. Я согласен с тем, что он хорошо документирован и довольно мал, и, похоже, в нем есть хороший набор тестов. Вероятно, это тоже соответствует вашим требованиям. Но, вероятно, есть несколько библиотек, которые подойдут. Я бы порекомендовал вам как можно лучше абстрагироваться от зависимостей Json, попробовать несколько библиотек и посмотреть, какая из них доставит вам меньше всего неприятностей :)
Мерлин Морган-Грэм,
Итак, @dshipper, вы выбрали sourceforge.net/projects/cjson или что?
Mawg просит восстановить Монику
37

cJSON имеет приличный API и небольшой (2 файла, ~ 700 строк). Многие другие парсеры JSON, на которые я смотрел сначала, были огромными ... Я просто хочу разобрать немного JSON.

Изменить: за последние годы мы внесли некоторые улучшения в cJSON.

NateS
источник
10

Jsmn довольно минималистичен и имеет всего две функции для работы.

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

Прабхприт
источник
Одним из недостатков jsmn является то, что он не обрабатывает escape-последовательности Unicode. В его источнике вы увидите: /* Allows escaped symbol \uXXXX */... case 'u':.../* TODO */
hippietrail
14
Кроме того, все, что он делает, это дает вам токены, удачи в понимании данных. Это действительно выглядит как самая маленькая и эффективная вещь, которую вы можете сделать, но она и не дает многого.
NateS
Судя по всему, они исправили свое «TODO» для символов Unicode.
Aviggiano
9

NXJSON - это полнофункциональный, но очень маленький (~ 400 строк кода) парсер JSON, который имеет простой в использовании API:

Ярослав Ставничий
источник
Поскольку вы, кажется, разработчик NXJSON, не могли бы вы прокомментировать, как он сравнивается с cJSON или другими вариантами?
Мэтт
5
Простые вещи, сделанные простым способом - это главное отличие NXJSON от большинства других парсеров. cJSON также прост, но помимо парсера json он также включает конструктор json, а также сериализатор. cJSON требуется больше памяти, поскольку он дублирует все строки, а NXJSON выполняет все манипуляции на месте, уничтожая исходный контент. В зависимости от вашей задачи эти различия можно рассматривать как достоинства или недостатки. NXJSON также обрабатывает комментарии, что удобно для анализа файлов конфигурации.
Ярослав Ставничий
9

Вы можете взглянуть на Янссон

На веб-сайте указано следующее: Jansson - это библиотека C для кодирования, декодирования и управления данными JSON. Особенности:

  • Простой и интуитивно понятный API и модель данных
  • Может как кодировать, так и декодировать из JSON
  • Полная документация
  • Нет зависимостей от других библиотек
  • Полная поддержка Unicode (UTF-8)
  • Обширный набор тестов
Тантраджа
источник
1
Прямая ссылка на Github: github.com/akheron/jansson
Ray Hulha
У меня возникло искушение использовать jsmnиз-за его скорости [1], но он не поддерживает кодирование. Кроме того, Jansson действительно проста в использовании. --- [1] translate.google.it/…
Марко Сулла
OjC работает быстро и поддерживает кодирование. github.com/ohler55/ojc
Питер Олер
Янссон - мой
Кеннет
8

Я использовал JSON-C для рабочего проекта и рекомендую его. Легковесный и выпускается с открытым лицензированием.

Документация включена в раздачу. В основном у вас есть *_addфункции для создания объектов JSON, эквивалентные*_put функции для освобождения их памяти и служебные функции, которые преобразуют типы и выходные объекты в строковое представление.

Лицензирование позволяет включить его в ваш проект. Мы использовали его таким образом, скомпилировав JSON-C как статическую библиотеку, которая связана с основной сборкой. Таким образом, нам не нужно беспокоиться о зависимостях (кроме установки Xcode).

JSON-C также без происшествий построен для нас под OS X (x86 Intel) и Linux (x86 Intel). Если ваш проект должен быть портативным, это хорошее начало.

Алекс Рейнольдс
источник
6

Вам нужно проанализировать произвольные структуры JSON или просто данные, относящиеся к вашему приложению. В последнем случае вы можете сделать его намного легче и эффективнее, не создавая никакой хэш-таблицы / структуры карты, сопоставляющей ключи JSON со значениями; вместо этого вы можете просто хранить данные непосредственно в полях структуры или в чем-то еще.

R .. GitHub НЕ ПОМОГАЕТ ICE
источник
2
Это очень важный момент при использовании JSON с нединамическими языками, такими как C. Но это не ответ, поэтому действительно должен быть комментарий к вопросу OP.
hippietrail
+1 за креативное мышление! Но как это будет работать? Разве здесь нельзя использовать особо легкую библиотеку? Разбор полей структуры по-прежнему кажется довольно трудоемким.
CL22,