Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
#1

Создание переменной из строки json - C++

26.01.2013, 19:22. Просмотров 2514. Ответов 22
Метки нет (Все метки)

Здравствуйте уважаемые форумчане!!!
Это моя первая тема, прошу сильно меня не бить

Дали задание для лабораторной работы, как делать не представляю...прошу помочь советом, кодом, ссылкой или полезной информацией.
Есть строка json, необходимо составить программу , которая разбирает строку на переменные и ,при запросе определенной переменной,выводит внутренние параметры этой переменной на экран.
Нашла информацию как это делать на JavaScript , но для c++ ничего такого не обнаружила и не поняла как... Прошу помощи!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2013, 19:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание переменной из строки json (C++):

Присвоить значение наименьшего элемента массива переменной М1, номер строки, где находится этот элемент, - переменной Т, номер столбца - переменной С - C++
Массив С действительных чисел имеет 5 строк и 11 столбцов. Присвоить значение наименьшего элемента массива переменной М1, номер строки, где...

Создать две переменных, ввести их с клавиатуры. Вывести строки: имя переменной - адрес переменной - значение п - C++
Создать две переменных, ввести их с клавиатуры. Вывести строки: имя переменной - адрес переменной - значение переменной.

Записать все слова символьной строки, чтобы каждое слово было с новой строки, и в отдельной переменной - C++
Здравствуйте. нужно сделать задание, Записать все слова символьной строки, чтобы каждое слово было с новой строки, и в отдельной...

Хитрое создание переменной - C++
Позвольте азадачить всех, кому интересно. Создаю переменные int konstruktor; int destruktor; не представляю, как их...

Создание Новой переменной! - C++
Помогите написать фрагмент кода задача в том что: Ну жно создать переменную char с именим веденным с клавы!

Создание файловой переменной - C++
Написал программу, пользователь вводит ФИО, группу, оценки и дату рождения о трёх студентах, потом получает всю эту информацию на экран....

22
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
26.01.2013, 21:01 #2
Karry, если я правильно понял, то можно воспользоваться boost.PropertyTree, выглядит это примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <sstream>
#include <string>
 
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
 
 
namespace bpt = boost::property_tree;
 
 
int main() {
   std::string jsonString; // пусть это строка с json
 
   std::istringstream iss(jsonString);
   bpt::ptree config;
   bpt::read_json(iss, config);
 
   while (true) {
      std::string var;   // путь к переменной через . (точку) (i.e. "one.two.three")
      std::cout << "var? ";  
      std::cin >> var;
 
      try {
         std::string const& value = config.get<std::string>(var);
         std::cout << value << std::endl;
      } catch (bpt::ptree_bad_path const&) {
         std::cerr << "No such var" << std::endl;
      }
   }
}
Здесь есть немного об этом.
1
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
26.01.2013, 21:14  [ТС] #3
gray_fox, Спасибо большое, думаю это подойдет!!!

А есть возможность как то еще ,не используя boost ... Просто думаю для лабораторной 2 семестра не слишком ли это будет шикарно и сложно..?)
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
26.01.2013, 21:52 #4
Цитата Сообщение от Karry Посмотреть сообщение
А есть возможность как то еще ,не используя boost ... Просто думаю для лабораторной 2 семестра не слишком ли это будет шикарно и сложно..?)
Можно использовать другие библиотеки, но лучше наверное boost ...

Цитата Сообщение от Karry Посмотреть сообщение
Просто думаю для лабораторной 2 семестра не слишком ли это будет шикарно и сложно..?)
Можно писать самому парсер, но- "это будет шикарно и сложно" как по мне.

Возможно задание стоит более конкретно разобрать строку заданного вида - то есть не учитывать все случии и вариации json формата ?
0
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
26.01.2013, 22:06  [ТС] #5
Цитата Сообщение от Avazart Посмотреть сообщение
Возможно задание стоит более конкретно разобрать строку заданного вида - то есть не учитывать все случии и вариации json формата ?
Возможно и так. Не знаю.
Задание звучало:Декодировать. С пояснением: разобрать строку на переменные и вывести внутренние параметры переменных. А что это такое и как это делать, я уже сама себе представила и начитала))))
0
Avazart
Нарушитель
Эксперт С++
7232 / 5404 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
26.01.2013, 23:57 #6
Ну к примеру код из http://ru.wikipedia.org/wiki/JSON
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
{
   "firstName": "Иван",
   "lastName": "Иванов",
   "address": {
       "streetAddress": "Московское ш., 101, кв.101",
       "city": "Ленинград",
       "postalCode": 101101
   },
   "phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}
Что нужно выводить и как быть со вложенными объектами ?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.01.2013, 00:05 #7
JSON Spirit можно использовать впринципе, ибо ptree не покроет всё. Простая либа впринципе, использует парсинг в map/vector. Можно и свой написать через тот же spirit.
0
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
27.01.2013, 00:40  [ТС] #8
Цитата Сообщение от Avazart Посмотреть сообщение
Ну к примеру код из http://ru.wikipedia.org/wiki/JSON
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
{
   "firstName": "Иван",
   "lastName": "Иванов",
   "address": {
       "streetAddres": "Московское ш., 101, кв.101",
       "city": "Ленинград",
       "postalCode": 101101
   },
   "phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}
Что нужно выводить и как быть со вложенными объектами ?
Как я понимаю, при запросы от пользователя firstName должно вывести Иван, при запросы address выводить streetAddres": "Московское ш., 101, кв.101",
"city": "Ленинград",
"postalCode": 101101,
при запросе streetAddres должно выводить соответственно Московское ш., 101, кв.101 и тд...
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.01.2013, 01:02 #9
Вот впринципе парсер на спирите. Как ни странно он действительно быстрый. Судя по тестам, он парсит 20 метров JSON-а 100 раз не намного медленнее, а то и быстрее библиотеки на С Yajl. Парсинг идет в стиле SAX, т.е. мы добавляем семантические действия и делаем что хотим в них. На память, выглядит вроде как-то так.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <boost/spirit/include/qi.hpp>
 
namespace qi = boost::spirit::qi;
 
auto real_ = qi::real_parser<double, qi::strict_real_policies<double>>();
 
template<typename Iter>
struct Json : qi::grammar<Iter>
{
    Json() : Json::base_type(json_)
    {
        using namespace qi;
 
        json_ = value_.alias();
        value_ = number_ |
            string_ |
            object_ |
            array_ |
            string("true") |
            string("false") |
            string("null");
        object_ = '{' >> -pairs_ >> '}';
        array_ = '[' >> -elements_ >> ']';
        elements_ = value_ % ',';
        pair_ = string_ >> ':' >> value_;
        pairs_ = pair_ % ',';
        string_ = qi::lexeme['"' >> qi::raw[*~char_('"')] >> '"'];
        number_ = real_ |
            uint_ |
            int_;
    }
    qi::rule<Iter> json_, number_, pair_, pairs_, elements_, array_, object_, value_;
    qi::rule<Iter, boost::iterator_range<Iter>()> string_;
};
 
void parse(const std::string& json)
{
    Json<std::string::const_iterator> grammar;
    auto begin = json.begin();
    if (!qi::parse(begin, json.end(), grammar) || begin != json.end())
    {
        std::cerr << "Error in parse" << std::endl;
    }
}
 
int main()
{
    const std::string json = "{"
        "\"name\":\"Vasya\","
        "\"age\":5,"
        "\"numbers\":[1,2,3],"
        "\"object\":{"
        "\"other\":\"end\"}"
        "}";
    parse(json);
    std::cin.get();
}
3
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
27.01.2013, 04:08 #10

Не по теме:

Никто не посоветует парсер YAML во что-нибудь подобное boost.PropertyTree (a la DOM) (spirit не предлагать, я с ним так и не разобрался)?



Добавлено через 10 минут
Цитата Сообщение от Karry Посмотреть сообщение
шикарно и сложно..?
boost.PropertyTree - по мне так довольно простое и удобное решение, но не самое универсальное (и, возможно, быстрое). Если собрались вручную парсить json, то флаг вам в руки)
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.01.2013, 12:56 #11
gray_fox, http://code.google.com/p/yaml-cpp/ вот впринципе, вроде нечто похожее.
1
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
28.01.2013, 03:45  [ТС] #12
gray_fox , не подскажете еще, как с помощью boost.PropertyTree выводить элементы массива?????
C++
1
2
3
4
5
6
7
"array1":[
"10",
"20",
"30",
"40",
"50"
]
но при использовании string const& value = config.get<string>("array1") выдает пустое место
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
28.01.2013, 04:28 #13
Karry, так например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <sstream>
#include <string>
 
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
 
 
namespace bpt = boost::property_tree;
 
 
int main() {
   std::string const jsonString = "{\"array1\":[\"10\",\"20\",\"30\",\"40\",\"50\"]}";
   
   std::istringstream iss(jsonString);
   bpt::ptree config;
   bpt::read_json(iss, config);
   
   bpt::ptree const& arrayNode = config.get_child("array1");
   for (bpt::ptree::const_iterator it = arrayNode.begin(); it != arrayNode.end(); ++it) {
      std::cout << it->second.get<int>("") << std::endl;
   }
}
http://liveworkspace.org/code/NLPUO
1
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
28.01.2013, 04:57  [ТС] #14
gray_fox, А можно как то вывести элементы "json test"
C++
1
2
3
4
5
6
7
8
9
10
"json test":{
        "test string":"test value",
        "array1":[
            "10",
            "20",
            "30",
            "40",
            "50"
        ]
    },
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
28.01.2013, 05:16 #15
Karry, не совсем понял. Что-то вроде этого?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <string>
 
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
 
 
namespace bpt = boost::property_tree;
 
 
void add_tabs(std::ostream & ostream, std::size_t t) {
   while (t-- != 0) {
      ostream << '\t';
   }
}
 
void print_children(std::ostream & ostream, bpt::ptree const& tree, std::size_t const t = 0) {
   for (bpt::ptree::const_iterator it = tree.begin(); it != tree.end(); ++it) {
      add_tabs(ostream, t);
      ostream << "'" << it->first << "':'" << it->second.data() << "'" << std::endl;
      if (!it->second.empty()) {
         print_children(ostream, it->second, t + 1);
      }
   }
}
 
 
int main() {
   std::string const jsonString = "{\"json test\":{"
        "\"test string\":\"test value\","
        "\"array1\":["
            "\"10\","
            "\"20\","
            "\"30\","
            "\"40\","
            "\"50\" "
        "]"
    "}}";
   
   std::istringstream iss(jsonString);
   bpt::ptree config;
   bpt::read_json(iss, config);
   
   bpt::ptree const& node = config.get_child("json test");
   print_children(std::cout, node);
}
http://liveworkspace.org/code/CASSn

Не по теме:

Уже страшновато становиться)

1
28.01.2013, 05:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2013, 05:16
Привет! Вот еще темы с ответами:

Создание текстовой переменной - C++
Заметил, что данный способ создаёт переменную без объявления её длины. char text = &quot;C++&quot;; cout &lt;&lt; text; // Ошибка char *text =...

Компилятор/создание переменной программно - C++
Сложно ли написать свой компилятор к (например) своему придуманному языку? Где можно об этом почитать? Меня интересует именно это: Как...

Создание файлов с переменной в названии - C++
string adrec = &quot;C:\\form\\&quot;+name+&quot;_&quot;+surname+&quot;.txt&quot;; ofstream file(adrec) ; как реализовать нормально эту мысль? name, surname...

Switch case создание переменной - C++
Добрый вечер, int main() { int a = 1; switch( a ) { // start case 1: int x = 10; break;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru