diff --git a/aos/json_to_flatbuffer.h b/aos/json_to_flatbuffer.h
new file mode 100644
index 0000000..6deb663
--- /dev/null
+++ b/aos/json_to_flatbuffer.h
@@ -0,0 +1,110 @@
+#ifndef AOS_JSON_TO_FLATBUFFER_H_
+#define AOS_JSON_TO_FLATBUFFER_H_
+
+#include <cstddef>
+#include <string>
+
+#include "flatbuffers/flatbuffers.h"
+
+namespace aos {
+
+// Parses the flatbuffer into the vector, or returns an empty vector.
+::std::vector<uint8_t> JsonToFlatbuffer(
+    const char *data, const flatbuffers::TypeTable *typetable);
+
+// Converts a flatbuffer into a Json string.
+//
+// multi_line controls if the Json is written out on multiple lines or one.
+::std::string FlatbufferToJson(const uint8_t *buffer,
+                               const flatbuffers::TypeTable *typetable,
+                               bool multi_line = false);
+
+// This class implements the state machine at json.org
+class Tokenizer {
+ public:
+  Tokenizer(const char *data) : data_(data) {}
+
+  enum class TokenType {
+    kEnd,
+    kError,
+    kStartObject,
+    kEndObject,
+    kStartArray,
+    kEndArray,
+    kField,
+    kNumberValue,
+    kStringValue,
+    kTrueValue,
+    kFalseValue,
+  };
+
+  // Returns the next token.
+  TokenType Next();
+
+  // Returns the last field_name and field_value.  These are only valid when
+  // Next returns them.
+  const ::std::string &field_name() const { return field_name_; }
+  const ::std::string &field_value() const { return field_value_; }
+
+  // Parses the current field value as a long long.  Returns false if it failed
+  // to parse.
+  bool FieldAsInt(long long *value);
+  // Parses the current field value as a double.  Returns false if it failed
+  // to parse.
+  bool FieldAsDouble(double *value);
+
+  // Returns true if we are at the end of the input.
+  bool AtEnd() { return *data_ == '\0'; }
+
+  const char *data_left() const { return data_; }
+
+ private:
+  // Consumes a string out of data_.  Populates s with the string.  Returns true
+  // if a valid string was found, and false otherwise.
+  // data_ is updated only on success.
+  bool ConsumeString(::std::string *s);
+  // Consumes a number out of data_.  Populates s with the string containing the
+  // number.  Returns true if a valid number was found, and false otherwise.
+  // data_ is updated only on success.
+  bool ConsumeNumber(::std::string *s);
+  // Consumes a fixed token out of data_. Returns true if the string was found,
+  // and false otherwise.
+  // data_ is updated only on success.
+  bool Consume(const char* token);
+  // Consumes whitespace out of data_. Returns true if the string was found,
+  // and false otherwise.
+  // data_ is unconditionally updated.
+  void ConsumeWhitespace();
+
+  // State for the parsing state machine.
+  enum class State {
+    kExpectField,
+    kExpectObjectStart,
+    kExpectObjectEnd,
+    kExpectArrayEnd,
+    kExpectValue,
+    kExpectEnd,
+  };
+
+  State state_ = State::kExpectObjectStart;
+
+  // Data pointer.
+  const char *data_;
+  // Current line number used for printing debug.
+  int linenumber_ = 0;
+
+  // Stack used to track which object type we were in when we recursed.
+  enum class ObjectType {
+    kObject,
+    kArray,
+  };
+  ::std::vector<ObjectType> object_type_;
+
+  // Last field name.
+  ::std::string field_name_;
+  // Last field value.
+  ::std::string field_value_;
+};
+}  // namespace aos
+
+#endif  // AOS_JSON_TO_FLATBUFFER_H_
