0 / 0 / 0
Регистрация: 23.07.2018
Сообщений: 11
1

Как засунуть массив Map в JSON

06.08.2018, 12:57. Показов 1454. Ответов 7

Требуется записать в JSON в виде:

JSON
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
{ 
"Name of File": "face0.jpg", 
"Coordinates": 
[ 
"[69, 29]", 
"[69, 142]", 
"[182, 29]", 
"[182, 142]" 
], 
"Name of File": "face1.jpg", 
"Coordinates": 
[ 
"[123, 79]", 
"[123, 181]", 
"[210, 79]", 
"[210, 181]" 
], 
"Name of File": "face2.jpg", 
"Coordinates": 
[ 
"[91, 33]", 
"[91, 134]", 
"[190, 33]", 
"[190, 134]" 
], 
}
Появилась идея создать массив, элементами которого будут map, и затем записать массив в JSON целиком.

Есть функция, которая переводит массив мэп в string и записывает в JSON:
C++
1
2
3
4
5
6
7
8
string map2json(std::vector<map<std::string, variant<vector <Point>, string>>>& vectorMap)
{
ptree pt;
pt.put("Result", map);
ostringstream buf;
write_json(buf, pt, false);
return buf.str();
}
Но в моменте
C++
1
pt.put("Result", map)
выдает ошибку, в чем может быть проблема?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2018, 12:57
Ответы с готовыми решениями:

Как разбить массив по 3 елемента и засунуть в другой массив
Здарова форумчане. Помогите, кому не лень решить задачу по программированию на c++ Кароче нам дан...

Как засунуть двумерный массив в функцию?
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int f(int,int); void main() { int...

Строку AnsiString разбить по словам и засунуть в массив
Есть строка: AnsiString s= &quot;Дед%Мазай%Любил%Больших%Девочек&quot;; как её можно разбить по словам...

Как вставить элемент и вывести элементы на экран в map<string, map<string,int>> ?
У меня есть map&lt;string, map&lt;string,int&gt;&gt;, в него надо добавить элементы (типа Ivanov potato 200)...

7
Эксперт С++
3058 / 1400 / 421
Регистрация: 19.01.2009
Сообщений: 3,769
06.08.2018, 13:41 2
Цитата Сообщение от Alex_Ogurtsov Посмотреть сообщение
выдает ошибку
Какую?

Цитата Сообщение от Alex_Ogurtsov Посмотреть сообщение
JSON
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
{ 
"Name of File": "face0.jpg", 
"Coordinates": 
[ 
"[69, 29]", 
"[69, 142]", 
"[182, 29]", 
"[182, 142]" 
], 
"Name of File": "face1.jpg", 
"Coordinates": 
[ 
"[123, 79]", 
"[123, 181]", 
"[210, 79]", 
"[210, 181]" 
], 
"Name of File": "face2.jpg", 
"Coordinates": 
[ 
"[91, 33]", 
"[91, 134]",
"[190, 33]", 
"[190, 134]" 
], 
}
Это не JSON, у вас дублируются ключи "Name of File" и "Coordinates" в пределах одного объекта. Должен быть массив объектов:

JSON
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
[{
    "Name of File": "face0.jpg",
    "Coordinates": [
        "[69, 29]",
        "[69, 142]",
        "[182, 29]",
        "[182, 142]"
    ]
}, {
    "Name of File": "face1.jpg",
    "Coordinates": [
        "[123, 79]",
        "[123, 181]",
        "[210, 79]",
        "[210, 181]"
    ]
}, {
    "Name of File": "face2.jpg",
    "Coordinates": [
        "[91, 33]",
        "[91, 134]",
        "[190, 33]",
        "[190, 134]"
    ]
}]
0
0 / 0 / 0
Регистрация: 23.07.2018
Сообщений: 11
06.08.2018, 15:49  [ТС] 3
Да, согласен. Как тогда сделать предложенный вами вариант?
0
MrGluck
06.08.2018, 16:58
  #4
 Комментарий модератора 
Alex_Ogurtsov, дублирование тем запрещено
0
Эксперт С++
3058 / 1400 / 421
Регистрация: 19.01.2009
Сообщений: 3,769
07.08.2018, 11:17 5
Цитата Сообщение от Alex_Ogurtsov Посмотреть сообщение
Как тогда сделать предложенный вами вариант?
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
#include <iostream>
#include <string>
#include <sstream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
 
namespace pt = boost::property_tree;
 
struct Item {
    std::string file_name;
    std::vector< std::pair<int, int> > coords;
};
typedef std::vector<Item> Items;
 
void toJSON(std::ostream & os, const Items & items) {
    pt::ptree objs;
    for (auto &item : items) {
        pt::ptree coords;
        for (auto & coord : item.coords) {
            std::stringstream coord_item;
            coord_item << "[" << coord.first << ", " << coord.second << "]";
            pt::ptree ci;
            ci.put("", coord_item.str());
            coords.push_back(std::make_pair("", ci));
        }
        pt::ptree obj_node;
        obj_node.put("Name of File", item.file_name);
        obj_node.push_back(std::make_pair("Coordinates", coords));
        objs.push_back(std::make_pair("", obj_node));
    }
 
    pt::ptree root;
    root.push_back(std::make_pair("Items", objs));
    pt::write_json(os, root);
}
 
int main() {
    Items items = {
        { "face0.jpg", { {69,   29}, {69, 142}, {182,  29}, {182, 142} } },
        { "face1.jpg", { {210, 181}, {210, 79}, {123, 181}, {123,  79} } },
        { "face2.jpg", { {91,   33}, {91, 134}, {190,  33}, {190, 134} } },
    };
    toJSON(std::cout, items);
}
JSON
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
{
    "Items": [
        {
            "Name of File": "face0.jpg",
            "Coordinates": [
                "[69, 29]",
                "[69, 142]",
                "[182, 29]",
                "[182, 142]"
            ]
        },
        {
            "Name of File": "face1.jpg",
            "Coordinates": [
                "[210, 181]",
                "[210, 79]",
                "[123, 181]",
                "[123, 79]"
            ]
        },
        {
            "Name of File": "face2.jpg",
            "Coordinates": [
                "[91, 33]",
                "[91, 134]",
                "[190, 33]",
                "[190, 134]"
            ]
        }
    ]
}
Цитата Сообщение от Alex_Ogurtsov Посмотреть сообщение
"[69, 29]"
кстати, это строка, а не массив из двух элементов. Если нужно чтобы это был массив, то нужно переписать форматирование с использованием std::stringstream (строки 20-23).
0
Don't worry, be happy
17213 / 10088 / 1948
Регистрация: 27.09.2012
Сообщений: 25,183
Записей в блоге: 1
07.08.2018, 14:56 6
Цитата Сообщение от schdub Посмотреть сообщение
Это не JSON, у вас дублируются ключи "Name of File" и "Coordinates" в пределах одного объекта.
JSON не накладывает ограничений на такие моменты.
0
Эксперт С++
3058 / 1400 / 421
Регистрация: 19.01.2009
Сообщений: 3,769
07.08.2018, 16:34 7
Croessmah, да, я знаю про ECMA-404. Но ведь есть и RFC 8259, который как раз таки и накладывает подобные ограничения. Как мне кажется, это является логичным и позволяет избежать возможных ошибок.

Цитата Сообщение от RFC 8259 :: The JavaScript Object Notation (JSON) Data Interchange Format :: 4. Objects
An object structure is represented as a pair of curly brackets
surrounding zero or more name/value pairs (or members). A name is a
string. A single colon comes after each name, separating the name
from the value. A single comma separates a value from a following
name. The names within an object SHOULD be unique.

object = begin-object [ member *( value-separator member ) ]
end-object

member = string name-separator value

An object whose names are all unique is interoperable in the sense
that all software implementations receiving that object will agree on
the name-value mappings. When the names within an object are not
unique, the behavior of software that receives such an object is
unpredictable. Many implementations report the last name/value pair
only. Other implementations report an error or fail to parse the
object, and some implementations report all of the name/value pairs,
including duplicates.

JSON parsing libraries have been observed to differ as to whether or
not they make the ordering of object members visible to calling
software. Implementations whose behavior does not depend on member
ordering will be interoperable in the sense that they will not be
affected by these differences.
0
Don't worry, be happy
17213 / 10088 / 1948
Регистрация: 27.09.2012
Сообщений: 25,183
Записей в блоге: 1
07.08.2018, 19:13 8
Цитата Сообщение от schdub Посмотреть сообщение
но ведь есть и RFC 8259,
В RFC 8259 уникальность ключей носит рекомендательный характер.
Там сказано, что слово SHOULD нужно интерпретировать в соответствии с документом RFC 2119:
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119].
А в RFC 2119 это слово определяется так:
SHOULD This word, or the adjective "RECOMMENDED", mean that there may exist valid reasons in particular circumstances to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course.
А безоговорочное требование - это MUST:
MUST This word, or the terms "REQUIRED" or "SHALL", mean that the definition is an absolute requirement of the specification.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2018, 19:13

Как вставить map в map
есть такой map map &lt; INT64 , map &lt;INT64 , map&lt; wArray , int &gt; &gt; &gt; tMenu; как его заполнить?...

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa;...

Как извлечь данные из access и засунуть в массив на VBA?
Задача такая Нужно из таблицы в аксес засунуть данные в массив. А дальше рандомом раскидать их в...

Сохранение map в json
Здравствуйте. Не могу решить одну проблему. Скорее всего я просто чего-то не знаю чтобы в ней...


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

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

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