mirror of
https://github.com/boostorg/json.git
synced 2026-01-29 19:42:14 +00:00
44 lines
1.9 KiB
Plaintext
44 lines
1.9 KiB
Plaintext
////
|
|
Copyright (c) 2023 Dmitry Arkhipov (grisumbras@yandex.ru)
|
|
|
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
Official repository: https://github.com/boostorg/json
|
|
////
|
|
|
|
= Direct Conversion
|
|
For large inputs parsing into the library's containers followed by conversion
|
|
via <<ref_value_to>> (or vice versa <<ref_value_from>> followed by
|
|
serialization from a <<ref_value>>) might be prohibitively expensive. For these
|
|
cases the library provides components that allow parsing directly into and
|
|
serializing directly from user-provided objects.
|
|
|
|
The drawback of this approach is that fully custom type representations are
|
|
not supported, only the library-provided conversions are. Also all objects that
|
|
should be populated by parsing have to be default constructible types. This
|
|
includes not only the top-level object, but e.g. elements of containers,
|
|
members of described `struct`s, and alternatives of variants.
|
|
|
|
That being said, if your types are default-constructible and you don't need the
|
|
customisability allowed by <<ref_value_to>> and <<ref_value_from>>, then you
|
|
can get a significant performance boost with direct conversions.
|
|
|
|
Direct parsing is performed by the <<ref_parse_into>> family of functions. The
|
|
library provides overloads that take either <<ref_string_view>> or
|
|
`std::istream`, and can report errors either via throwing exceptions or setting
|
|
an error code.
|
|
|
|
[source]
|
|
----
|
|
include::../../../test/snippets.cpp[tag=doc_parse_into_1,indent=0]
|
|
----
|
|
|
|
If you need to combine incremental parsing with direct parsing, you can resort
|
|
to <<ref_parser_for>>. `parser_for<T>` is an instantiation of
|
|
<<ref_basic_parser>> that parses into an object of type `T`, and is what
|
|
<<ref_parse_into>> uses under the hood.
|
|
|
|
Direct serialization doesn't require any special components and works with the
|
|
regular <<ref_serializer>> and <<ref_serialize>>.
|