Skip to content

Commit 1c98677

Browse files
committed
Handle Nan, Infinity
1 parent 00c49fd commit 1c98677

File tree

3 files changed

+30
-23
lines changed

3 files changed

+30
-23
lines changed
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,36 @@
11
#include "JsonHandler.h"
22

3+
namespace rj = rapidjson;
4+
5+
36
JsonHandler::JsonHandler(const ParseOptions &options)
47
: m_parseOptions(options)
58
{
69
}
710

811
auto JsonHandler::GetCompressedJson(const std::string &jsonText) -> const Result
912
{
10-
rapidjson::StringBuffer sb;
11-
rapidjson::Writer<rapidjson::StringBuffer> handler(sb);
13+
rj::StringBuffer sb;
14+
rj::Writer<rj::StringBuffer, rj::UTF8<>, rj::UTF8<>, rj::CrtAllocator, rj::kWriteNanAndInfFlag> handler(sb);
1215

13-
return ParseJson(jsonText, sb, handler);
16+
return ParseJson<flgBaseWriter>(jsonText, sb, handler);
1417
}
1518

1619
auto JsonHandler::FormatJson(const std::string &jsonText, LE le, LF lf, char indentChar, unsigned indentLen) -> const Result
1720
{
18-
rapidjson::StringBuffer sb;
19-
rapidjson::PrettyWriter<rapidjson::StringBuffer> handler(sb);
21+
rj::StringBuffer sb;
22+
rj::PrettyWriter<rj::StringBuffer, rj::UTF8<>, rj::UTF8<>, rj::CrtAllocator, rj::kWriteNanAndInfFlag> handler(sb);
2023
handler.SetLineEnding(le);
2124
handler.SetFormatOptions(lf);
2225
handler.SetIndent(indentChar, indentLen);
2326

24-
return ParseJson(jsonText, sb, handler);
27+
return ParseJson<flgBaseWriter>(jsonText, sb, handler);
2528
}
2629

2730
auto JsonHandler::ValidateJson(const std::string &jsonText) -> const Result
2831
{
29-
rapidjson::StringBuffer sb;
30-
rapidjson::Writer<rapidjson::StringBuffer> handler(sb);
32+
rj::StringBuffer sb;
33+
rj::Writer<rj::StringBuffer, rj::UTF8<>, rj::UTF8<>, rj::CrtAllocator, rj::kWriteNanAndInfFlag> handler(sb);
3134

32-
return ParseJson(jsonText, sb, handler);
35+
return ParseJson<flgBaseWriter>(jsonText, sb, handler);
3336
}

NppJSONViewer/NppJsonViewer/JsonHandler.h

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
#include <rapidjson/error/en.h>
1010
#include "Define.h"
1111

12+
namespace rj = rapidjson;
13+
1214
struct Result
1315
{
1416
bool success = false;
@@ -18,8 +20,11 @@ struct Result
1820
std::string response;
1921
};
2022

21-
using LE = rapidjson::LineEndingOption;
22-
using LF = rapidjson::PrettyFormatOptions;
23+
using LE = rj::LineEndingOption;
24+
using LF = rj::PrettyFormatOptions;
25+
26+
constexpr auto flgBaseReader = rj::kParseEscapedApostropheFlag | rj::kParseNanAndInfFlag | rj::kParseNumbersAsStringsFlag;
27+
constexpr auto flgBaseWriter = rj::kParseEscapedApostropheFlag | rj::kParseNanAndInfFlag | rj::kParseFullPrecisionFlag;
2328

2429
class JsonHandler
2530
{
@@ -33,23 +38,22 @@ class JsonHandler
3338
auto FormatJson(const std::string &jsonText, LE le, LF lf, char indentChar, unsigned indentLen) -> const Result;
3439
auto ValidateJson(const std::string &jsonText) -> const Result;
3540

36-
template <typename Handler>
37-
auto ParseJson(const std::string &jsonText, rapidjson::StringBuffer &sb, Handler &handler) -> const Result;
41+
template <unsigned format, typename Handler>
42+
auto ParseJson(const std::string &jsonText, rj::StringBuffer &sb, Handler &handler) -> const Result;
3843
};
3944

40-
template <typename Handler>
41-
inline auto JsonHandler::ParseJson(const std::string &jsonText, rapidjson::StringBuffer &sb, Handler &handler) -> const Result
45+
template <unsigned flgBase, typename Handler>
46+
inline auto JsonHandler::ParseJson(const std::string &jsonText, rj::StringBuffer &sb, Handler &handler) -> const Result
4247
{
4348
Result retVal {};
4449

45-
bool success = false;
46-
rapidjson::Reader reader;
47-
rapidjson::StringStream ss(jsonText.c_str());
50+
bool success = false;
51+
rj::Reader reader;
52+
rj::StringStream ss(jsonText.c_str());
4853

4954
// TODO: Find some better way
50-
constexpr auto flgBase = rapidjson::kParseFullPrecisionFlag | rapidjson::kParseEscapedApostropheFlag | rapidjson::kParseNanAndInfFlag;
51-
constexpr auto flgBase_commemt = flgBase | rapidjson::kParseCommentsFlag;
52-
constexpr auto flgBase_comma = flgBase | rapidjson::kParseTrailingCommasFlag;
55+
constexpr auto flgBase_commemt = flgBase | rj::kParseCommentsFlag;
56+
constexpr auto flgBase_comma = flgBase | rj::kParseTrailingCommasFlag;
5357
constexpr auto flgBase_Both = flgBase_comma | flgBase_commemt;
5458

5559
if (m_parseOptions.bIgnoreComment && m_parseOptions.bIgnoreTraillingComma)
@@ -82,7 +86,7 @@ inline auto JsonHandler::ParseJson(const std::string &jsonText, rapidjson::Strin
8286
else
8387
{
8488
retVal.success = false;
85-
retVal.error_str = rapidjson::GetParseError_En(reader.GetParseErrorCode());
89+
retVal.error_str = rj::GetParseError_En(reader.GetParseErrorCode());
8690
retVal.error_pos = static_cast<int>(reader.GetErrorOffset());
8791
retVal.error_code = reader.GetParseErrorCode();
8892
retVal.response.clear();

NppJSONViewer/NppJsonViewer/JsonViewDlg.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ void JsonViewDlg::PopulateTreeUsingSax(HTREEITEM tree_root, const std::string &j
186186
RapidJsonHandler handler(this, tree_root);
187187
rapidjson::StringBuffer sb;
188188

189-
Result res = JsonHandler(m_pSetting->parseOptions).ParseJson(jsonText, sb, handler);
189+
Result res = JsonHandler(m_pSetting->parseOptions).ParseJson<flgBaseReader>(jsonText, sb, handler);
190190
if (!res.success)
191191
{
192192
// Mark the error position

0 commit comments

Comments
 (0)