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

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

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

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

26.01.2013, 19:22. Просмотров 2625. Ответов 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
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
28.01.2013, 05:34  [ТС] #16
gray_fox, оцените пожалуйста!!!)) Наверно написано криво и неграмотно, но вот что получилось...
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "stdafx.h"
#include <iostream>
#include <string>
#include <map>
#include <list>
#include <exception>
#include <vector>
#include <math.h>
using namespace std;
typedef vector<string> vector_string;
typedef map<string,string> map_string;
 
#include <sstream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
namespace bpt = boost::property_tree;
 
class JSON  //jsonlint.com
{
private:
    string container;
public:
    JSON()
    {
        container = "{";
    }
    void add_pair(string name,string value)
    {
        container += "\"" +name + "\":\"" + value + "\",";
    }
    void add_vector(string name, vector_string params)
    {
          container+="\"" + name + "\":[";
          for (int i=0; i < params.size(); i++)
          {
              container+="\"" +params[i] + "\"";
              if (i<params.size()-1)
              {
                  container+=",";
              }
          }
          container+="],";
    }
    void add_map(string name, map_string params)
    {
        container += "\"" +name +"\":{";
        map_string::const_iterator begin = params.begin();
        for(;begin!=params.end(); begin++)
        {
            container+= "\"" + begin->first + "\":\"" +begin->second + "\",";
        }
        container = container.substr(0,container.length()-1)+ "},";
    }
    void add_JSON(string name, JSON * json)
    {
        container += "\"" +name + "\":" +json->get_as_string() +",";
    
    }
    string get_as_string()
    {
        return container.substr(0,container.length()-1)+ "}";
    }
};
void add_tabs(std::ostream & ostream, size_t t) 
{
   while (t-- != 0) 
   {
       ostream << '\t';
   }
}
 
void print_children(ostream & ostream, bpt::ptree const& tree, 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() << endl;
       if (!it->second.empty()) 
       {
           print_children(ostream, it->second, t + 1);
       }
   }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    JSON a;
    a.add_pair("test string","test value");
    vector_string s;
    s.push_back("10");
    s.push_back("20");
    s.push_back("30");
    s.push_back("40");
    s.push_back("50");
    a.add_vector("array1", s);
    a.add_JSON("json test", &a);
    map_string ms;
    ms["green"] = "apple";
    ms["red"] = "cherry";
    ms["yallow"] = "banana";
    ms["black"] = "chernika";
    a.add_map("fruits",ms);
    cout << a.get_as_string() << endl;
    cout <<endl;
 
 
    string jsonStr = a.get_as_string();
    istringstream iss(jsonStr);
    bpt::ptree config;
    bpt::read_json(iss, config);
 
    while(true)
    {
        string var;   // путь к переменной через . (точку) (i.e. "one.two.three")
        cout << "Var: ";
        getline(cin,var);
        if(var == "test string")
        {
            string const& value = config.get<string>(var);
            cout << value << std::endl;
        }
        else if(var == "fruits")
        {
            const boost::property_tree::ptree& server = config.get_child(var);
            cout << "fruits\n"
                << "black:\t" << server.get<std::string>("black") << '\n'
                << "green:\t" << server.get<std::string>("green") << '\n'
                << "red:\t" << server.get<std::string>("red") << '\n'
                << "yallow:\t" << server.get<std::string>("yallow") << '\n';
        }
        else if(strcmp("fruits.**",var.c_str())<0)
        {
            string const& value = config.get<string>(var);
            cout << value << std::endl; 
        }
        else if(var == "array1")
        {
            bpt::ptree const& arrayNode = config.get_child(var);
            for (bpt::ptree::const_iterator it = arrayNode.begin(); it != arrayNode.end(); ++it)
            {
                cout << it->second.get<int>("") << endl;
            }
        }
        else if(var == "json test")
        {
            bpt::ptree const& node = config.get_child("json test");
            print_children(cout, node);
        }
    }
    return 0;
}
последний вывод json test так и не заработал(
0
gray_fox
What a waste!
1536 / 1241 / 71
Регистрация: 21.04.2012
Сообщений: 2,608
Завершенные тесты: 3
28.01.2013, 20:17 #17
Karry, не очень понятно, зачем создавать строку с json, что бы потом её парсить в propety_tree, можно ведь сразу туда добавлять:
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
#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() {
   bpt::ptree config;
   
   config.put("test string", "test value");
   
   bpt::ptree & arrayNode = config.put("array1", "");
   for (std::size_t i = 1; i <= 5; ++i) {
      std::ostringstream oss;
      oss << (i * 10);
      std::string const& str = oss.str();
      arrayNode.push_back(bpt::ptree::value_type("", bpt::ptree(str)));
   }
   
   config.push_back(bpt::ptree::value_type("json test", config));
   
   config.put("fruits.green"  , "apple");
   config.put("fruits.red"    , "cherry");
   config.put("fruits.yellow" , "banana");
   config.put("fruits.black"  , "bilberry");
   
   bpt::write_json(std::cout, config);
}
http://liveworkspace.org/code/4eelSX

Добавлено через 1 минуту

Не по теме:

Да, массивы добавляются черти знает как...

1
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
28.01.2013, 20:22  [ТС] #18
Цитата Сообщение от gray_fox Посмотреть сообщение
Karry, не очень понятно, зачем создавать строку с json, что бы потом её парсить в propety_tree, можно ведь сразу туда добавлять:
Строка json c таким ее заполнением, была мне дана преподавателем, мне нужно произвести с ней вот такие работы и махинации))

Добавлено через 1 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
Не по теме:
Да, массивы добавляются черти знает как...
а можно как нибудь переделать вывод массивов????? например если разделить вывод строки "test string" и "array1" ... там незнаю, вывод первого узла, вывод второго....... или такого нет?
0
gray_fox
What a waste!
1536 / 1241 / 71
Регистрация: 21.04.2012
Сообщений: 2,608
Завершенные тесты: 3
28.01.2013, 21:00 #19
Цитата Сообщение от Karry Посмотреть сообщение
а можно как нибудь переделать вывод массивов????? например если разделить вывод строки "test string" и "array1" ... там незнаю, вывод первого узла, вывод второго....... или такого нет?
Если имеется ввиду взять значение массива по индексу, то нет, из коробки так нельзя (по крайней мере я не знаю как), придётся сначала искать узел-предок для элементов массива, потом уже брать н-й элемент. Вообще по простому можно как-то так сделать:
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
#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() {
   bpt::ptree config;
   
   config.put("test string", "test value");
   
   bpt::ptree & arrayNode = config.put("array1", "");
   for (std::size_t i = 1; i <= 5; ++i) {
      std::ostringstream oss;
      oss << (i * 10);
      std::string const& str = oss.str();
      arrayNode.push_back(bpt::ptree::value_type("", bpt::ptree(str)));
   }
   
   config.push_back(bpt::ptree::value_type("json test", config));
   
   config.put("fruits.green"  , "apple");
   config.put("fruits.red"    , "cherry");
   config.put("fruits.yellow" , "banana");
   config.put("fruits.black"  , "bilberry");
   
  
   std::string path;
   while (std::getline(std::cin, path)) {
      std::cout << "Query for '" << path << "':" << std::endl;
      
      boost::optional<bpt::ptree &> result = config.get_child_optional(path);
      if (result) {
         bpt::ptree const& node = result.get();         
         if (node.empty()) {
            std::cout << node.data() << std::endl;
         } else {
            bpt::write_json(std::cout, node);
         }
      } else {
         std::cout << "'" << path << "': no such var" << std::endl;
      }
   }
}
http://liveworkspace.org/code/1z070U

Добавлено через 21 минуту

Не по теме:

Прошлый раз забыл "publish" нажать, код был не доступен


Может ещё так сойдёт:
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
#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() {
   bpt::ptree config;
   
   config.put("test string", "test value");
   
   bpt::ptree & arrayNode = config.put("array1", "");
   for (std::size_t i = 1; i <= 5; ++i) {
      std::ostringstream oss;
      oss << (i * 10);
      std::string const& str = oss.str();
      arrayNode.push_back(bpt::ptree::value_type("", bpt::ptree(str)));
   }
   
   config.push_back(bpt::ptree::value_type("json test", config));
   
   config.put("fruits.green"  , "apple");
   config.put("fruits.red"    , "cherry");
   config.put("fruits.yellow" , "banana");
   config.put("fruits.black"  , "bilberry");
   
  
   std::string path;
   while (std::getline(std::cin, path)) {
      std::cout << "Query for '" << path << "':" << std::endl;
      
      boost::optional<bpt::ptree &> result = config.get_child_optional(path);
      if (result) {
         bpt::ptree const& node = result.get();         
         bpt::path lastTag = bpt::path(path).reduce();         
         bpt::ptree result;
         result.add_child(lastTag, node);         
         bpt::write_json(std::cout, result);
      } else {
         std::cout << "'" << path << "': no such var" << std::endl;
      }
   }
}
http://liveworkspace.org/code/4jaTF7
1
Karry
0 / 0 / 0
Регистрация: 26.01.2013
Сообщений: 21
28.01.2013, 21:06  [ТС] #20
gray_fox, Спасибо большое, чуть позже попробую, а то надо курсовую по с++ еще делать=((( =)
0
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
25.11.2014, 18:02 #21
Всем привет!
Возник вопрос по этой же теме.

Есть JSON вида

JSON
1
2
3
4
5
6
7
8
{
"level1":[
{
"level21":[значение1, значение2]
},
{
"level22":[значение3, значение4]
}
Как перебрать массив внутри level1 из вышесказанного ясно. Но как быть, когда внутри этого массива находится не какоето конечное значение, а новый узел, который сам по себе сожержит массив?
0
Renji
2087 / 1445 / 331
Регистрация: 05.06.2014
Сообщений: 4,178
25.11.2014, 23:31 #22
Использовать универсальный контейнер способный хранить в себе и строки, и числа, и vector/map узлов json.
0
hoggy
6804 / 2991 / 515
Регистрация: 15.11.2014
Сообщений: 6,766
Завершенные тесты: 1
25.11.2014, 23:35 #23
https://github.com/mrtazz/json-cpp
0
25.11.2014, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2014, 23:35
Привет! Вот еще темы с ответами:

Создание текстовой переменной - 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;


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

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

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