mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 15:00:04 +00:00
Refactor json utility to wxdata, add ReadJsonString function
This commit is contained in:
parent
895e760fee
commit
9f33189c18
12 changed files with 245 additions and 228 deletions
|
|
@ -1,41 +1,19 @@
|
|||
#include <scwx/qt/util/json.hpp>
|
||||
#include <scwx/util/json.hpp>
|
||||
#include <scwx/util/logger.hpp>
|
||||
|
||||
#include <fstream>
|
||||
|
||||
#include <boost/json.hpp>
|
||||
#include <fmt/ranges.h>
|
||||
#include <QFile>
|
||||
#include <QTextStream>
|
||||
|
||||
namespace scwx
|
||||
{
|
||||
namespace qt
|
||||
{
|
||||
namespace util
|
||||
{
|
||||
namespace json
|
||||
namespace scwx::qt::util::json
|
||||
{
|
||||
|
||||
static const std::string logPrefix_ = "scwx::qt::util::json";
|
||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||
|
||||
/* Adapted from:
|
||||
* https://www.boost.org/doc/libs/1_77_0/libs/json/doc/html/json/examples.html#json.examples.pretty
|
||||
*
|
||||
* Copyright (c) 2019, 2020 Vinnie Falco
|
||||
* Copyright (c) 2020 Krystian Stasiowski
|
||||
* Distributed under the Boost Software License, Version 1.0. (See
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
static void PrettyPrintJson(std::ostream& os,
|
||||
boost::json::value const& jv,
|
||||
std::string* indent = nullptr);
|
||||
|
||||
static boost::json::value ReadJsonFile(QFile& file);
|
||||
static boost::json::value ReadJsonStream(std::istream& is);
|
||||
|
||||
boost::json::value ReadJsonFile(const std::string& path)
|
||||
boost::json::value ReadJsonQFile(const std::string& path)
|
||||
{
|
||||
boost::json::value json;
|
||||
|
||||
|
|
@ -46,8 +24,7 @@ boost::json::value ReadJsonFile(const std::string& path)
|
|||
}
|
||||
else
|
||||
{
|
||||
std::ifstream ifs {path};
|
||||
json = ReadJsonStream(ifs);
|
||||
json = ::scwx::util::json::ReadJsonFile(path);
|
||||
}
|
||||
|
||||
return json;
|
||||
|
|
@ -65,7 +42,7 @@ static boost::json::value ReadJsonFile(QFile& file)
|
|||
std::string jsonSource = jsonStream.readAll().toStdString();
|
||||
std::istringstream is {jsonSource};
|
||||
|
||||
json = ReadJsonStream(is);
|
||||
json = ::scwx::util::json::ReadJsonStream(is);
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
|
@ -78,147 +55,4 @@ static boost::json::value ReadJsonFile(QFile& file)
|
|||
return json;
|
||||
}
|
||||
|
||||
static boost::json::value ReadJsonStream(std::istream& is)
|
||||
{
|
||||
std::string line;
|
||||
|
||||
boost::json::stream_parser p;
|
||||
boost::system::error_code ec;
|
||||
|
||||
while (std::getline(is, line))
|
||||
{
|
||||
p.write(line, ec);
|
||||
if (ec)
|
||||
{
|
||||
logger_->warn("{}", ec.message());
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
p.finish(ec);
|
||||
if (ec)
|
||||
{
|
||||
logger_->warn("{}", ec.message());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return p.release();
|
||||
}
|
||||
|
||||
void WriteJsonFile(const std::string& path,
|
||||
const boost::json::value& json,
|
||||
bool prettyPrint)
|
||||
{
|
||||
std::ofstream ofs {path};
|
||||
|
||||
if (!ofs.is_open())
|
||||
{
|
||||
logger_->warn("Cannot write JSON file: \"{}\"", path);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (prettyPrint)
|
||||
{
|
||||
PrettyPrintJson(ofs, json);
|
||||
}
|
||||
else
|
||||
{
|
||||
ofs << json;
|
||||
}
|
||||
ofs.close();
|
||||
}
|
||||
}
|
||||
|
||||
static void PrettyPrintJson(std::ostream& os,
|
||||
boost::json::value const& jv,
|
||||
std::string* indent)
|
||||
{
|
||||
std::string indent_;
|
||||
if (!indent)
|
||||
indent = &indent_;
|
||||
switch (jv.kind())
|
||||
{
|
||||
case boost::json::kind::object:
|
||||
{
|
||||
os << "{\n";
|
||||
indent->append(4, ' ');
|
||||
auto const& obj = jv.get_object();
|
||||
if (!obj.empty())
|
||||
{
|
||||
auto it = obj.begin();
|
||||
for (;;)
|
||||
{
|
||||
os << *indent << boost::json::serialize(it->key()) << " : ";
|
||||
PrettyPrintJson(os, it->value(), indent);
|
||||
if (++it == obj.end())
|
||||
break;
|
||||
os << ",\n";
|
||||
}
|
||||
}
|
||||
os << "\n";
|
||||
indent->resize(indent->size() - 4);
|
||||
os << *indent << "}";
|
||||
break;
|
||||
}
|
||||
|
||||
case boost::json::kind::array:
|
||||
{
|
||||
os << "[\n";
|
||||
indent->append(4, ' ');
|
||||
auto const& arr = jv.get_array();
|
||||
if (!arr.empty())
|
||||
{
|
||||
auto it = arr.begin();
|
||||
for (;;)
|
||||
{
|
||||
os << *indent;
|
||||
PrettyPrintJson(os, *it, indent);
|
||||
if (++it == arr.end())
|
||||
break;
|
||||
os << ",\n";
|
||||
}
|
||||
}
|
||||
os << "\n";
|
||||
indent->resize(indent->size() - 4);
|
||||
os << *indent << "]";
|
||||
break;
|
||||
}
|
||||
|
||||
case boost::json::kind::string:
|
||||
{
|
||||
os << boost::json::serialize(jv.get_string());
|
||||
break;
|
||||
}
|
||||
|
||||
case boost::json::kind::uint64:
|
||||
os << jv.get_uint64();
|
||||
break;
|
||||
|
||||
case boost::json::kind::int64:
|
||||
os << jv.get_int64();
|
||||
break;
|
||||
|
||||
case boost::json::kind::double_:
|
||||
os << jv.get_double();
|
||||
break;
|
||||
|
||||
case boost::json::kind::bool_:
|
||||
if (jv.get_bool())
|
||||
os << "true";
|
||||
else
|
||||
os << "false";
|
||||
break;
|
||||
|
||||
case boost::json::kind::null:
|
||||
os << "null";
|
||||
break;
|
||||
}
|
||||
|
||||
if (indent->empty())
|
||||
os << "\n";
|
||||
}
|
||||
|
||||
} // namespace json
|
||||
} // namespace util
|
||||
} // namespace qt
|
||||
} // namespace scwx
|
||||
} // namespace scwx::qt::util::json
|
||||
|
|
|
|||
|
|
@ -1,7 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include <boost/json/value.hpp>
|
||||
|
||||
namespace scwx
|
||||
|
|
@ -13,10 +11,7 @@ namespace util
|
|||
namespace json
|
||||
{
|
||||
|
||||
boost::json::value ReadJsonFile(const std::string& path);
|
||||
void WriteJsonFile(const std::string& path,
|
||||
const boost::json::value& json,
|
||||
bool prettyPrint = true);
|
||||
boost::json::value ReadJsonQFile(const std::string& path);
|
||||
|
||||
} // namespace json
|
||||
} // namespace util
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue