static bool jobject_to_string_append (jvalue_ref jref, JStreamRef generating) { SANITY_CHECK_POINTER(jref); if (UNLIKELY(!generating->o_begin (generating))) { PJ_LOG_ERR("Schema validation error, objects are not allowed."); return false; } if (!jis_object (jref)) { const char *asStr = jvalue_tostring_internal_layer2 (jref, NULL, false); generating->string (generating, J_CSTR_TO_BUF("Internal error - not an object")); generating->string (generating, j_cstr_to_buffer(asStr)); // create invalid JSON on purpose return false; } jobject_iter it; jobject_iter_init(&it, jref); jobject_key_value key_value; while (jobject_iter_next(&it, &key_value)) { assert(jis_string(key_value.key)); if(UNLIKELY(!key_value_to_string_append(key_value, generating))) { return false; } } if (UNLIKELY(!generating->o_end (generating))) { PJ_LOG_ERR("Schema validation error, object did not validate against schema"); return false; } return true; }
JValue::ObjectIterator::ObjectIterator(jvalue_ref parent) : _parent(0) , _at_end(false) { _key_value.key = 0; _key_value.value = 0; if (UNLIKELY(!jobject_iter_init(&_it, parent))) throw InvalidType("Can't iterate over non-object"); _parent = jvalue_copy(parent); _at_end = !jobject_iter_next(&_it, &_key_value); }
/** * specification says it's undefined, but implementation-wise, * the C api will return the current iterator if you try to go past the end. * */ JValue::ObjectIterator& JValue::ObjectIterator::operator++() { _at_end = !jobject_iter_next(&_it, &_key_value); return *this; }