Given this JSON:
{
"abc": [ { "def": 4 }, {} ],
"def": 42
}
and a reader which is in the root JSON point:
json::reader reader(raw_json);
assert(reader.symbol() == json::token::symbol::begin_object);
find_key(reader, "def") would advance the reader to hold the point/value 42.
An initial non-tested implementation is:
if (reader.symbol() != json::token::symbol::begin_object)
return false;
if (!reader.next())
return false;
while (true) {
// Key
if (reader.symbol() == json::token::symbol::end_object) {
reader.next();
return false;
}
if (reader.value<std::string>() == key) {
reader.next();
return reader.symbol() != json::token::symbol::error;
}
if (!reader.next())
return false;
// Value
skip_element(reader);
if (reader.symbol() == json::token::error)
return false;
}
I think this function should only try to find the key if it is given the token at the begin_object token because the semantics are clearer. If you're already iterating over the object keys, there is no point in provide an “easier” function to you, as all you'd need is the skip_element function and stay in the loop (one call to the skip_element in the else clause and nothing more... which is 2 extra lines for user code...).
Also, if you think this function can belong to Trial.Protocol, another function could be close_current_object which would pair with the reader advanced by find_key nicely.
Given this JSON:
{ "abc": [ { "def": 4 }, {} ], "def": 42 }and a reader which is in the root JSON point:
find_key(reader, "def")would advance the reader to hold the point/value42.An initial non-tested implementation is:
I think this function should only try to find the key if it is given the token at the
begin_objecttoken because the semantics are clearer. If you're already iterating over the object keys, there is no point in provide an “easier” function to you, as all you'd need is theskip_elementfunction and stay in the loop (one call to theskip_elementin the else clause and nothing more... which is 2 extra lines for user code...).Also, if you think this function can belong to Trial.Protocol, another function could be
close_current_objectwhich would pair with thereaderadvanced byfind_keynicely.