aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/json/easy_parse/json_easy_parser.h
blob: 64c483aabaf00d6fac605fcb241b1fc5699bfc4d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#pragma once 

#include <util/generic/string.h>
#include <util/generic/vector.h> 
#include <util/stream/input.h> 
#include <util/stream/output.h> 
#include "json_easy_parser_impl.h" 
 
namespace NJson { 
    /* This class filters out nodes from a source JSON by a xpath-style description. It represent these nodes as a tab-delimited string (or a vector).
     * It is useful if you need to parse a data which comes into JSON in a known and fixed format.
     * Fields are set as a list of keys separated by slash, for example:
     *    Field x/y/z in JSON { "x" : { "y" : { "w" : 1, "z" : 2 } } contains number 2.
     * In a path to a field you can also provide a special array identifier "[]", identifier of a particular field in an array (for example "[4]") or wildcard "*".
     *
     * The parser of the class supports parsing of several fields. Each of them could be marked as mandatory or as optional.
     * If a mandatory field is not found in JSON, then Parse() returns false and ConvertToTabDelimited() returns an empty string.
     * If an optional field is not found in JSON, then it's value in Parse()/ConvertToTabDelimited() is an empty string.
     * In particular ConvertToTabDelimited() always returns either an empty string, or a string of the same number of tab-delimited fields starting from the same Prefix.
     *
     * NB! Library can not extract values of not a simple type (namely it doesn't support the case when a result is a vocabulary or an array) from JSON.
     * If you expect such a case, please check json_value.h.
     */
 
    class TJsonParser { 
        TString Prefix;
 
        struct TField { 
            TVector<TPathElem> Path;
            bool NonEmpty; 
        }; 
        TVector<TField> Fields;
 
        friend class TRewriteJsonImpl; 
 
        void ConvertToTabDelimited(IInputStream& in, IOutputStream& out) const;

    public: 
        void SetPrefix(const TString& prefix) {
            Prefix = prefix; 
        } 
        void AddField(const TString& path, bool mustExist);
        TString ConvertToTabDelimited(const TString& json) const;
        bool Parse(const TString& json, TVector<TString>* res) const;
    }; 
}