Added structured error reporting to Reader.
This allows applications for interactively viewing or editing JSON to do
a better job of highlighting errors. Also added offset accessors to
Value, offering the same sort of functionality even for non-errors.
Thanks to Zach Clifford (zacharyc@google.com) for the patch.
diff --git a/include/json/reader.h b/include/json/reader.h
index 0771342..6271f71 100644
--- a/include/json/reader.h
+++ b/include/json/reader.h
@@ -33,6 +33,19 @@
typedef char Char;
typedef const Char *Location;
+ /** \brief An error tagged with where in the JSON text it was encountered.
+ *
+ * The offsets give the [start, limit) range of bytes within the text. Note
+ * that this is bytes, not codepoints.
+ *
+ */
+ struct StructuredError
+ {
+ size_t offset_start;
+ size_t offset_limit;
+ std::string message;
+ };
+
/** \brief Constructs a Reader allowing all features
* for parsing.
*/
@@ -95,6 +108,14 @@
*/
std::string getFormattedErrorMessages() const;
+ /** \brief Returns a vector of structured erros encounted while parsing.
+ * \return A (possibly empty) vector of StructuredError objects. Currently
+ * only one error can be returned, but the caller should tolerate multiple
+ * errors. This can occur if the parser recovers from a non-fatal
+ * parse error and then encounters additional errors.
+ */
+ std::vector<StructuredError> getStructuredErrors() const;
+
private:
enum TokenType
{
diff --git a/include/json/value.h b/include/json/value.h
index bd7f181..f18457a 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -442,6 +442,13 @@
iterator begin();
iterator end();
+ // Accessors for the [start, limit) range of bytes within the JSON text from
+ // which this value was parsed, if any.
+ void setOffsetStart( size_t start );
+ void setOffsetLimit( size_t limit );
+ size_t getOffsetStart() const;
+ size_t getOffsetLimit() const;
+
private:
Value &resolveReference( const char *key,
bool isStatic );
@@ -509,6 +516,11 @@
int memberNameIsStatic_ : 1; // used by the ValueInternalMap container.
# endif
CommentInfo *comments_;
+
+ // [start, limit) byte offsets in the source JSON text from which this Value
+ // was extracted.
+ size_t start_;
+ size_t limit_;
};