+/* Parses 'json' as a datum of the type described by 'type'. If successful,
+ * returns NULL and initializes 'datum' with the parsed datum. On failure,
+ * returns an error and the contents of 'datum' are indeterminate. The caller
+ * is responsible for freeing the error or the datum that is returned.
+ *
+ * Violations of constraints expressed by 'type' are treated as errors.
+ *
+ * If 'symtab' is nonnull, then named UUIDs in 'symtab' are accepted. Refer to
+ * ovsdb/SPECS for information about this, and for the syntax that this
+ * function accepts. */
+struct ovsdb_error *
+ovsdb_datum_from_json(struct ovsdb_datum *datum,
+ const struct ovsdb_type *type,
+ const struct json *json,
+ struct ovsdb_symbol_table *symtab)
+{
+ struct ovsdb_error *error;
+
+ error = ovsdb_datum_from_json__(datum, type, json, symtab);
+ if (error) {
+ return error;
+ }
+
+ error = ovsdb_datum_sort(datum, type->key.type);
+ if (error) {
+ ovsdb_datum_destroy(datum, type);
+ }
+ return error;
+}
+
+/* This is the same as ovsdb_datum_from_json(), except that duplicate values
+ * in a set or map are dropped instead of being treated as an error. */
+struct ovsdb_error *
+ovsdb_datum_from_json_unique(struct ovsdb_datum *datum,
+ const struct ovsdb_type *type,
+ const struct json *json,
+ struct ovsdb_symbol_table *symtab)
+{
+ struct ovsdb_error *error;
+
+ error = ovsdb_datum_from_json__(datum, type, json, symtab);
+ if (!error) {
+ ovsdb_datum_sort_unique(datum, type->key.type, type->value.type);
+ }
+ return error;
+}
+
+/* Converts 'datum', of the specified 'type', to JSON format, and returns the
+ * JSON. The caller is responsible for freeing the returned JSON.
+ *
+ * 'type' constraints on datum->n are ignored.
+ *
+ * Refer to ovsdb/SPECS for the format of the JSON that this function
+ * produces. */