Name | Updated at | |
---|---|---|
parse | ||
verify | ||
.clang-format | ||
README.md |
libjsonpbparse
This library provides functions to parse a JSON file to a structured Protobuf message.
At this time of writing, libprotobuf-cpp-full
is at version 3.0.0-beta, and
unknown fields in a JSON file cannot be ignored. Do NOT use this library in
vendor / recovery until libprotobuf-cpp-full
is updated.
libjsoncpp
in parser codeSince libjsonpbparse
cannot be used in vendor / recovery processes yet,
libjsoncpp
is used instead. However, there are notable differences in the
logic of libjsoncpp
and libprotobuf
when parsing JSON files.
libjsoncpp
. Hence:
(s|fixed|u|)int64
):
libjsonpbverify
)libjsoncpp
) must explicitly convert strings to
integers. Example:
strtoull(value.asString(), 0, 10)
"NaN"
, "Infinity"
, "-Infinity"
)double d;
if (value.isNumeric()) {
d = value.asDouble();
} else {
auto&& s = value.asString();
if (s == "NaN") d = std::numeric_limits<double>::quiet_NaN();
else if (s == "Infinity") d = std::numeric_limits<double>::infinity();
else if (s == "-Infinity") d = -std::numeric_limits<double>::infinity();
}
libprotobuf
accepts either lowerCamelCase
(or json_name
option if it is
defined) or the original field name as keys in the input JSON file.
The test in libjsonpbverify
explicitly check this case to avoid ambiguity;
only the original field name (or json_name
option if it is defined) can be
used.Once libprotobuf
in the source tree is updated to a higher version and
libjsonpbparse
is updated to ignore unknown fields in JSON files, all parsing
code must be converted to use libjsonpbparse
for consistency.
libjsonpbverify
This library provides functions and tests to examine a JSON file and validate it against a Protobuf message definition.
In addition to a validity check that libprotobuf
can convert the JSON file to a
Protobuf message (using libjsonpbparse
), it also checks the following:
json_name
option of a Protobuf field, or name of a Protobuf field if
json_name
is not defined. lowerCamelCase
supported by libprotobuf
is
explicitly disallowed (unless explicitly used in json_name
). For example,
in the following Protobuf file, only keys foo_bar
and barBaz
are allowed
in the JSON file:
message Foo {
string foo_bar = 1;
string bar_baz = 2 [json_name = "barBaz"];
}
json == convert_to_json(convert_to_pb(json))
, using libprotobuf
.
This imposes additional restrictions including:
Check JSON Mapping before defining a Protobuf object as a JSON schema. In general:
libjsonverify
does not support proto2.bool
.(s|fixed|u|)int32
, float
, or double
in the schemastring
s, but if you want to impose more
restrictions on the string, you can also use Timestamp
, bytes
,
float
or double
(if NaN and infinity are valid values),
enumerations, etc.
message
, unless you have a good reason
to use map<string, T>
.Any
; it defeats the purpose of having the schema.Example:
#include <jsonpb/verify.h>
using namespace ::android::jsonpb;
std::unique_ptr<JsonSchemaTestConfig> CreateCgroupsParam() {
}
INSTANTIATE_TEST_SUITE_P(LibProcessgroupProto, JsonSchemaTest,
::testing::Values(MakeTestParam<Cgroups>("cgroups.json")));