mirror of
https://github.com/nlohmann/json.git
synced 2026-10-27 00:08:55 +00:00
* json_view: view_mode enum instead of bool Editable, node_kind for node::kind basic_json_document and basic_json_view take a view_mode (read_only, the default, or editable) instead of a bool: basic_json_document<json, true> did not say what true means. The shortcut aliases are unchanged. The kind of a node is a node_kind (the value_t values plus link, 10 as before), which removes the static_cast<std::uint8_t>(value_t::...) of every comparison. The node and image layouts are unchanged. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * json_view: node_kind in the node writers, spell out read_only, comment fixes The builder and the edit functions take and store a node_kind instead of casting a value_t; the numbering assertions and the comments now speak of node_kind, and the link kind notes that it follows value_t::discarded. The read-only aliases name view_mode::read_only like the editable ones. view_mode.md says the mode is a compile-time property of the type. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * json_view: views of read-only documents convert to editable views A read-only document has no edits, so a view of it reads correctly as a view of an editable document before its first edit. The implicit conversion lets a function taking a json_editable_view accept the views of both modes. There is no conversion the other way: a read-only view of an editable document would read wrong values after the next edit. The mode comparisons in the cross-mode operator==/!= use an is_other_mode trait, which astyle keeps compact. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
37 lines
1.2 KiB
C++
37 lines
1.2 KiB
C++
#include <iostream>
|
|
#include <nlohmann/json_view.hpp>
|
|
|
|
using nlohmann::basic_json_view;
|
|
using nlohmann::view_mode;
|
|
|
|
// accepts the views of read-only and of editable documents, of json and of ordered_json
|
|
template<typename BasicJsonType, view_mode Mode>
|
|
std::size_t count_members(basic_json_view<BasicJsonType, Mode> v)
|
|
{
|
|
return v.is_object() ? v.size() : 0;
|
|
}
|
|
|
|
// accepts only the views of editable documents
|
|
template<typename BasicJsonType>
|
|
bool is_edited(basic_json_view<BasicJsonType, view_mode::editable> v)
|
|
{
|
|
return v.is_string() && v.get_string() == "edited";
|
|
}
|
|
|
|
// a function (no template) taking a json_editable_view also accepts the view of a read-only document
|
|
std::size_t size_of(nlohmann::json_editable_view v)
|
|
{
|
|
return v.size();
|
|
}
|
|
|
|
int main()
|
|
{
|
|
const nlohmann::json_document doc = nlohmann::json_document::parse(R"({"a": 1, "b": 2})");
|
|
nlohmann::json_editable_document edoc = nlohmann::json_editable_document::parse(R"({"a": 1})");
|
|
edoc.set(edoc.root()["a"], "edited");
|
|
|
|
std::cout << count_members(doc.root()) << ' ' << count_members(edoc.root()) << '\n';
|
|
std::cout << std::boolalpha << is_edited(edoc.root()["a"]) << '\n';
|
|
std::cout << size_of(doc.root()) << ' ' << size_of(edoc.root()) << '\n';
|
|
}
|