1 #ifndef ZSERIO_JSON_PARSER_H_INC
2 #define ZSERIO_JSON_PARSER_H_INC
17 template <
typename ALLOC = std::allocator<u
int8_t>>
110 m_tokenizer(in, allocator),
140 return m_tokenizer.getLine();
150 return m_tokenizer.getColumn();
159 void parseElements();
162 void visitValue()
const;
168 static const std::array<JsonToken, 3> ELEMENT_TOKENS;
171 IObserver& m_observer;
174 template <
typename ALLOC>
175 const std::array<JsonToken, 3> BasicJsonParser<ALLOC>::ELEMENT_TOKENS = {
178 template <
typename ALLOC>
179 void BasicJsonParser<ALLOC>::parseElement()
181 JsonToken token = m_tokenizer.getToken();
190 throw createUnexpectedTokenException(ELEMENT_TOKENS);
193 template <
typename ALLOC>
194 void BasicJsonParser<ALLOC>::parseObject()
197 m_observer.beginObject();
203 m_observer.endObject();
206 template <
typename ALLOC>
207 void BasicJsonParser<ALLOC>::parseMembers()
217 template <
typename ALLOC>
218 void BasicJsonParser<ALLOC>::parseMember()
221 const AnyHolder<ALLOC>& key = m_tokenizer.getValue();
222 if (!key.template isType<string<ALLOC>>())
224 throw JsonParserException(
"JsonParser:")
225 << getLine() <<
":" << getColumn() <<
": Key must be a string value!";
227 m_observer.visitKey(key.template get<string<ALLOC>>());
235 template <
typename ALLOC>
236 void BasicJsonParser<ALLOC>::parseArray()
239 m_observer.beginArray();
241 if (std::find(ELEMENT_TOKENS.begin(), ELEMENT_TOKENS.end(), m_tokenizer.getToken()) != ELEMENT_TOKENS.end())
245 m_observer.endArray();
248 template <
typename ALLOC>
249 void BasicJsonParser<ALLOC>::parseElements()
259 template <
typename ALLOC>
260 void BasicJsonParser<ALLOC>::parseValue()
266 template <
typename ALLOC>
267 void BasicJsonParser<ALLOC>::visitValue()
const
269 const AnyHolder<ALLOC>& value = m_tokenizer.getValue();
271 if (value.template isType<std::nullptr_t>())
273 m_observer.visitValue(
nullptr);
275 else if (value.template isType<bool>())
277 m_observer.visitValue(value.template get<bool>());
279 else if (value.template isType<int64_t>())
281 m_observer.visitValue(value.template get<int64_t>());
283 else if (value.template isType<uint64_t>())
285 m_observer.visitValue(value.template get<uint64_t>());
287 else if (value.template isType<double>())
289 m_observer.visitValue(value.template get<double>());
293 m_observer.visitValue(value.template get<string<ALLOC>>());
297 template <
typename ALLOC>
298 void BasicJsonParser<ALLOC>::checkToken(
JsonToken token)
300 if (m_tokenizer.getToken() != token)
301 throw createUnexpectedTokenException({{token}});
304 template <
typename ALLOC>
305 void BasicJsonParser<ALLOC>::consumeToken(
JsonToken token)
311 template <
typename ALLOC>
312 JsonParserException BasicJsonParser<ALLOC>::createUnexpectedTokenException(
313 Span<const JsonToken> expecting)
const
315 JsonParserException error(
"JsonParser:");
316 error << getLine() <<
":" << getColumn() <<
": unexpected token: " << m_tokenizer.getToken();
317 if (expecting.size() == 1)
319 error <<
", expecting " << expecting[0] <<
"!";
323 error <<
", expecting one of [";
324 for (
size_t i = 0; i < expecting.size(); ++i)
328 error << expecting[i];
virtual void endArray()=0
virtual void visitValue(uint64_t uintValue)=0
virtual void visitValue(int64_t intValue)=0
virtual void beginArray()=0
virtual void visitKey(StringView key)=0
virtual void beginObject()=0
virtual ~IObserver()=default
virtual void visitValue(std::nullptr_t nullValue)=0
virtual void visitValue(double doubleValue)=0
virtual void visitValue(StringView stringValue)=0
virtual void endObject()=0
virtual void visitValue(bool boolValue)=0
BasicJsonParser(std::istream &in, IObserver &observer, const ALLOC &allocator=ALLOC())