Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
//Внутри массива ключ игнорируется, даже если ошибочно задан

но она всегда естьЭто где она всегда есть? Сколько API сайтов не перелопатил, нигде не встречал. XML Schema существует так же, как и JSON Schema (документ IETF, между прочим). А вот то, что на практике его мало кто использует, это уже другой вопрос.
#include <iostream>
#include <unordered_map>
#include <boost/property_tree/json_parser.hpp>
int main()
{
auto pt = boost::property_tree::ptree{};
pt.put("Comment", "My comment");
pt.put("Count", 10);
pt.put("DiskParam.DB", 10.0);
pt.put("DiskParam.DBAngle", 1.234);
pt.put("Range", true);
auto blades = std::unordered_map<std::string, int>{{"A", 1}, {"B", 2}, {"C", 2}};
auto bladesTree = boost::property_tree::ptree{};
for (const auto &kv : blades) {
auto blade = boost::property_tree::ptree{};
blade.add("Caption", kv.first);
blade.add("Value", kv.second);
bladesTree.push_back(std::make_pair("", blade));
}
pt.add_child("Blades", bladesTree);
auto slotsTree = boost::property_tree::ptree{};
for (auto i = 0; i < 3; i++) {
auto slot = boost::property_tree::ptree{std::to_string(i)};
slotsTree.push_back(std::make_pair("", slot));
}
pt.add_child("Slots", slotsTree);
auto buf = std::ostringstream{};
boost::property_tree::write_json(buf, pt);
std::cout << buf.str();
}
import Data.Char
import Data.List (intercalate)
data JValue = JString String
| JNumber Double
| JBool Bool
| JNull
| JObject [(String, JValue)]
| JArray [JValue]
deriving Show
renderJValue :: JValue -> String
renderJValue (JString s) = show s
renderJValue (JNumber n) = show n
renderJValue (JBool True) = "true"
renderJValue (JBool False) = "false"
renderJValue JNull = "null"
renderJValue (JObject o) = "{" ++ pairs o ++ "}"
where pairs [] = ""
pairs ps = intercalate ", " (map renderPair ps)
renderPair (k, v) = show k ++ ": " ++ renderJValue v
renderJValue (JArray a) = "[" ++ values a ++ "]"
where values [] = ""
values vs = intercalate ", " (map renderJValue vs)
main = putStrLn $ renderJValue (JObject [
("Comment", JString "My comment"),
("Count", JNumber 10),
("DiskParam", JObject [
("DB", JNumber 10),
("DBAngle", JNumber 1.234)
]),
("Range", JBool True),
("Blades", JArray $ map (\ch ->
JObject [
("Caption", JString (ch:[])),
("Value", JNumber (fromIntegral (ord ch)))
]) ['A'..'C']),
("Slots", JArray [JNumber 0, JNumber 1, JNumber 2])
])
OBJECT("")
{
VALUE("Comment", Header.Comment);
VALUE("Count", Header.Count);
OBJECT("DiskParam")
{
VALUE("DB", Header.DB);
VALUE("DBAngle", Header.DBAngle);
}
VALUE("Range", Header.Range);
//Чтение массива с неизвестным числом элементов
ARRAY_WHILE("Blades", BladeCount)
{
TBlade Blade;
OBJECT("")
{
VALUE("Caption", Blade.Caption);
VALUE("Value", Blade.BaseChar);
}
if(!ERROR)
{
NewBlades=realloc(Blades, BladeCount+1);
if(NewBlades)
{
Blades=NewBlades;
Blades[BladeCount]=Blade;
}
}
}
//Чтение массива с известным или ограниченным числом элементов
ARRAY_FOR("Slots", SlotsCount, MAX_ELEMENTS)
VALUE("", Slots[SlotsCount]);
//Обработка ситуаций, когда значение может быть неподходящего типа
double Temp;
VALUE("NCount", Temp)
Header.NCount=(int)(Temp+0.5);
}Я просто уверен, такого синтаксиса вы еще нигде не видели :). Имеет смысл писать статью или снова заминусуете велосипедиста?
Запись данных в формате JSON