LINUX.ORG.RU

распарсить json данные

 ,


0

4

Есть данные в формате json. Нужно использовать либо си библиотеку, например json,json-c,json-glib. или c++ библиотеку jsoncpp. Нужно получить нужные данные из json данных. Как это сделать?

Ответ на: комментарий от u0atgKIRznY5

тут, впрочем как и везде, отвечают на конкретные вопросы.

вот примеры для json-glib: https://wiki.gnome.org/action/show/Projects/JsonGlib?action=show&redirect...

#include <stdlib.h>
#include <glib-object.h>
#include <json-glib/json-glib.h>

int
main (int argc, char *argv[])
{
  JsonParser *parser;
  JsonNode *root;
  GError *error;

  if (argc < 2)
    {
      g_print ("Usage: test <filename.json>\n");
      return EXIT_FAILURE;
    }

  parser = json_parser_new ();

  error = NULL;
  json_parser_load_from_file (parser, argv[1], &error);
  if (error)
    {
      g_print ("Unable to parse `%s': %s\n", argv[1], error->message);
      g_error_free (error);
      g_object_unref (parser);
      return EXIT_FAILURE;
    }

  root = json_parser_get_root (parser);

  /* manipulate the object tree and then exit */

  g_object_unref (parser);

  return EXIT_SUCCESS;
}

Что тут не понятно?

sniper21 ★★★★★
()
Последнее исправление: sniper21 (всего исправлений: 1)

ну распарсить и получить. в чем проблема то?

anonymous
()
Ответ на: комментарий от sniper21

О спасибо, да я уже наверное устал программить. Вот и ищу помощи. А как получить например данные слова name?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от sniper21

Да, кстати, я видел тоже примеры где из файла данные берутся. Но у меня массив.

u0atgKIRznY5
() автор топика

Ну загугли example для каждой из библиотек. По-моему, это быстрее, чем тему на лоре создать. P.S Лично я нашел вполне вменяемый пример для jsoncpp.

Meyer ★★★★★
()
Последнее исправление: Meyer (всего исправлений: 1)

Или есть программа с открытым исходным кодом, которая работает с json.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Стреляться нах*р. Ну серьезно, там же все прокомментировано. Можно еще почитать вот это. Я до этого момента краем уха слышал о этой библиотеке, но после чтения пары примеров смог разобраться, как и что.

Meyer ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Всё правильно он сказал. Если не понимаешь примеры использования библиотек - значит ты не понимаешь язык программирования, на котором эти примеры написаны. Ибо примеры на то и примеры, чтобы для них понимания требовалось знать только язык программирования - именно по этим примерам работу с библиотеками и учат.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Ибо примеры на то и примеры, чтобы для них понимания требовалось знать только язык программирования - именно по этим примерам работу с библиотеками и учат.

Там такие примеры, где либо показывают создание с нуля, либо еще что нибудь. А мне нужно получить из json массива данные по ключам. Ты если видел такое, покажи, где именно то, что мне нужно.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

тоже такой вопрос интересует. Пока пытаюсь найти время на qjson на Qt. На хабре статья даже на русском есть. Правда пока не читал даже её.

TomBOY ★★
()
Ответ на: комментарий от u0atgKIRznY5

Раз в университете не научили искать инфо, то это плохо.

Идем сюда это описание API: https://developer.gnome.org/json-glib/1.2/JsonParser.html#json-parser-load-fr...

смотрим пример из моего коммента выше. Совмещаем А и Б.

parser = json_parser_new ();

error = NULL;
//json_parser_load_from_file (parser, argv[1], &error);
json_parser_load_from_data (parser,
                            buff.c_str,
                            buff.length,
                            &error

sniper21 ★★★★★
()
Ответ на: комментарий от sniper21

Да я уже как раз с json_glib разбираюсь, только почему то пока segfault вываливается. Я то что ты написал уже понел. Начал по немногу вливаться в работу библиотеки.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от TomBOY

Все, разобрался. В общем смотри код, можешь этот пример запустить.

json_reader_read_member ( jr, «name» ) этот name мне известен был, поэтому я его указал. А так можно вывести с помощью s все значения. Мне пришлось вывести json массив в файл и оттуда получать, чтобы лишний раз из сети не забирать. Этот пример полностью работающий о показывающий как подготовить данные и получить значения.

#include <stdio.h>
#include <stdlib.h>
#include <json-glib/json-glib.h>

int main ( int argc, char *argv[] )
{
	JsonParser *js = json_parser_new ( );

	json_parser_load_from_file ( js, "json_data", NULL );
	JsonNode *node = json_parser_get_root ( js );

	JsonReader *jr = json_reader_new ( node );
	json_reader_set_root ( jr, node );

	if ( !json_reader_read_element ( jr, 0 ) ){
		const GError *error = json_reader_get_error ( jr );
		g_print ( "Unable to read the element: %s\n", error->message );
	}
	printf ( "elements: %d\n", json_reader_count_elements ( jr ) );
	printf ( "counts: %d\n", json_reader_count_members ( jr ) );

	char **s = json_reader_list_members ( jr );
	for ( int i = 0; i < json_reader_count_members ( jr ); i++ ) {
		printf ( "%s\n", s[i] );
	}
	json_reader_end_element ( jr );

	if ( !json_reader_read_member ( jr, "name" ) ) {
		json_reader_end_member ( jr );
	}
	printf ("%s\n", json_reader_get_string_value ( jr ) );

	json_reader_end_member ( jr );
	
}

u0atgKIRznY5
() автор топика
Ответ на: комментарий от sniper21

У меня получилось, как выглядит работа с либой можешь посмотреть на сообщение выше.

u0atgKIRznY5
() автор топика

Книжку Розенталя уже предлагали?

creazero
()
Ответ на: комментарий от rumgot

Не совсем по теме: на qt можно парсить json.

Это хорошо.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Да уж. Обмазываться glib, чтобы парсить json, вместо того, чтобы взять jsoncpp или что-то другое. Верной дорогой идешь.

Meyer ★★★★★
()
Ответ на: комментарий от TomBOY

Только пока если count_elements переместить, чтобы показало нужное количество елементов, то потом segfaultom завершается.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Мне пришлось вывести json массив в файл и оттуда получать, чтобы лишний раз из сети не забирать.

Так не делают, конечно.

Но как выглядит массив ты не указал.

sniper21 ★★★★★
()
Ответ на: комментарий от sniper21

В общем еще такая проблема, как видишь здесь есть два вида, один вид, industrial, id, name, и id, name.

Но как выглядит массив ты не указал.

А как указать?

[{"industries":[{"id":"34.422","name":"Неорганическая химия (производство)"},{"id":"34.421","name":"Лакокрасочная продукция, сырье (продвижение, оптовая торговля)"},{"id":"34.420","name":"Лакокрасочная продукция, сырье (производство)"},{"id":"34.419","name":"Бетон, кирпич, стекло и прочие силикаты (продвижение, оптовая торговля)"},{"id":"34.426","name":"Резина, пластмасса и прочее (производство)"},{"id":"34.425","name":"Органическая химия (продвижение, оптовая торговля)"},{"id":"34.424","name":"Органическая химия (производство)"},{"id":"34.423","name":"Неорганическая химия (продвижение, оптовая торговля)"},{"id":"34.427","name":"Резина, пластмасса и прочее (продвижение, оптовая торговля)"},{"id":"34.418","name":"Бетон, кирпич, стекло и прочие силикаты (производство)"},{"id":"34.417","name":"Агрохимия (продвижение, оптовая торговля)"},{"id":"34.416","name":"Агрохимия (производство)"}],"id":"34","name":"Химическое производство, удобрения"},{"industries":[{"id":"36.403","name":"Государственные организации"}],"id":"36","name":"Государственные организации"},{"industries":[{"id":"37.630","name":"Религиозная организация"}]

u0atgKIRznY5
() автор топика
Ответ на: комментарий от sniper21

Вот как мне получить и правильно отобразить двухуровневый.

GET /industries возвращает двухуровневый справочник всех отраслей.

[
  {
    "id": "49",
    "name": "Услуги для населения",
    "industries": [
        {
            "id": "49.408",
            "name": "Ритуальные услуги"
        }
    ]
  }
]

В справочнике возможны другие значения.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от anonymous

Он игнорит анонимусов. Причём, судя по постепенной смене поведения не кнопкой, а именно не отвечает.

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

понел

Я сначала думал, что прикалываешься, но после стольких сообщений уже не смешно.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от u0atgKIRznY5

Чтобы понять рекурсию, надо понять рекурсию :)

Делаешь функцию чтения блока, а дальше условие, если нашли industries вызываешь эту же функцию внутри себя.

sniper21 ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Лично я нашел вполне вменяемый пример для jsoncpp.

Я смотрел этот пример, так и не понел что делать.

Наверное, ты тупой. Лучше книжку почитай с картинками.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от u0atgKIRznY5

так и не понел что делать.

Учить С++. Разве это не очевидно?

Unicode4all ★★★★★
()

Знакомая задача

Не раз всплывала такая задача, пользовались сначала сторонними либами, которые модгут распарсить json в какое-либо свое представление и наоборот сгенерить json из своего представления. Но такой подход требует много boilerplate-кода. В итоге родилась небольшая библиотека: json_dto. Она позволяет конвертировать json в c++ структуры/классы и наоборот.

Выглядит это примерно так:

// Message.
struct message_t
{
  message_t() {}

  message_t( std::string from, std::int64_t when, std::string text )
    :  m_from{ std::move( from ) }
    ,  m_when{ when }
    ,  m_text{ std::move( text ) }
  {}

  // Who sent a message.
  std::string m_from;
  // When the message was sent (unixtime).
  std::int64_t m_when;
  // Message text.
  std::string m_text;

  template< typename Json_Io >
  void json_io( Json_Io & io )
  {
    io & json_dto::mandatory( "from", m_from )
      & json_dto::mandatory( "when", m_when )
      & json_dto::mandatory( "text", m_text );
  }
};

// ...

auto msg = json_dto::from_json< message_t >( json_data );
auto json_str = json_dto::to_json( msg );

kola
()

Посмотри код bti Хартмана, там как раз есть парсин json'a и xml'я

zl0y
()
Ответ на: комментарий от Virtuos86

Наверное, ты тупой. Лучше книжку почитай с картинками.

Я видел такую книжку по C. Из какой-то серии для совсем нубов. Кстати, книжка годная, надо вспомнить только, как называется.

Meyer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.