@@ -1120,10 +1120,11 @@ std::unique_ptr<web::json::details::_Value> JSON_Parser<CharType>::_ParseValue(
1120
1120
} // namespace json
1121
1121
} // namespace web
1122
1122
1123
- static web::json::value _parse_stream (utility::istream_t & stream)
1123
+ template <typename CharType>
1124
+ static web::json::value _parse_stream (std::basic_istream<CharType>& stream)
1124
1125
{
1125
- web::json::details::JSON_StreamParser<utility:: char_t > parser (stream);
1126
- web::json::details::JSON_Parser<utility:: char_t >::Token tkn;
1126
+ web::json::details::JSON_StreamParser<CharType > parser (stream);
1127
+ typename web::json::details::JSON_Parser<CharType >::Token tkn;
1127
1128
1128
1129
parser.GetNextToken (tkn);
1129
1130
if (tkn.m_error )
@@ -1136,18 +1137,19 @@ static web::json::value _parse_stream(utility::istream_t& stream)
1136
1137
{
1137
1138
web::json::details::CreateException (tkn, utility::conversions::to_string_t (tkn.m_error .message ()));
1138
1139
}
1139
- else if (tkn.kind != web::json::details::JSON_Parser<utility:: char_t >::Token::TKN_EOF)
1140
+ else if (tkn.kind != web::json::details::JSON_Parser<CharType >::Token::TKN_EOF)
1140
1141
{
1141
1142
web::json::details::CreateException (tkn,
1142
1143
_XPLATSTR (" Left-over characters in stream after parsing a JSON value" ));
1143
1144
}
1144
1145
return value;
1145
1146
}
1146
1147
1147
- static web::json::value _parse_stream (utility::istream_t & stream, std::error_code& error)
1148
+ template <typename CharType>
1149
+ static web::json::value _parse_stream (std::basic_istream<CharType>& stream, std::error_code& error)
1148
1150
{
1149
- web::json::details::JSON_StreamParser<utility:: char_t > parser (stream);
1150
- web::json::details::JSON_Parser<utility:: char_t >::Token tkn;
1151
+ web::json::details::JSON_StreamParser<CharType > parser (stream);
1152
+ typename web::json::details::JSON_Parser<CharType >::Token tkn;
1151
1153
1152
1154
parser.GetNextToken (tkn);
1153
1155
if (tkn.m_error )
@@ -1157,7 +1159,7 @@ static web::json::value _parse_stream(utility::istream_t& stream, std::error_cod
1157
1159
}
1158
1160
1159
1161
auto returnObject = parser.ParseValue (tkn);
1160
- if (tkn.kind != web::json::details::JSON_Parser<utility:: char_t >::Token::TKN_EOF)
1162
+ if (tkn.kind != web::json::details::JSON_Parser<CharType >::Token::TKN_EOF)
1161
1163
{
1162
1164
web::json::details::SetErrorCode (tkn, web::json::details::json_error::left_over_character_in_stream);
1163
1165
}
@@ -1166,11 +1168,11 @@ static web::json::value _parse_stream(utility::istream_t& stream, std::error_cod
1166
1168
return returnObject;
1167
1169
}
1168
1170
1169
- # ifdef _WIN32
1170
- static web::json::value _parse_narrow_stream ( std::istream& stream )
1171
+ template < typename CharType>
1172
+ static web::json::value _parse_string ( const std::basic_string<CharType>& str )
1171
1173
{
1172
- web::json::details::JSON_StreamParser< char > parser (stream );
1173
- web::json::details::JSON_StreamParser< char >::Token tkn;
1174
+ web::json::details::JSON_StringParser<CharType > parser (str );
1175
+ typename web::json::details::JSON_Parser<CharType >::Token tkn;
1174
1176
1175
1177
parser.GetNextToken (tkn);
1176
1178
if (tkn.m_error )
@@ -1183,18 +1185,19 @@ static web::json::value _parse_narrow_stream(std::istream& stream)
1183
1185
{
1184
1186
web::json::details::CreateException (tkn, utility::conversions::to_string_t (tkn.m_error .message ()));
1185
1187
}
1186
- else if (tkn.kind != web::json::details::JSON_Parser<char >::Token::TKN_EOF)
1188
+ else if (tkn.kind != web::json::details::JSON_Parser<CharType >::Token::TKN_EOF)
1187
1189
{
1188
1190
web::json::details::CreateException (tkn,
1189
1191
_XPLATSTR (" Left-over characters in stream after parsing a JSON value" ));
1190
1192
}
1191
1193
return value;
1192
1194
}
1193
1195
1194
- static web::json::value _parse_narrow_stream (std::istream& stream, std::error_code& error)
1196
+ template <typename CharType>
1197
+ static web::json::value _parse_string (const std::basic_string<CharType>& str, std::error_code& error)
1195
1198
{
1196
- web::json::details::JSON_StreamParser< char > parser (stream );
1197
- web::json::details::JSON_StreamParser< char >::Token tkn;
1199
+ web::json::details::JSON_StringParser<CharType > parser (str );
1200
+ typename web::json::details::JSON_Parser<CharType >::Token tkn;
1198
1201
1199
1202
parser.GetNextToken (tkn);
1200
1203
if (tkn.m_error )
@@ -1204,7 +1207,7 @@ static web::json::value _parse_narrow_stream(std::istream& stream, std::error_co
1204
1207
}
1205
1208
1206
1209
auto returnObject = parser.ParseValue (tkn);
1207
- if (tkn.kind != web::json::details::JSON_Parser<utility:: char_t >::Token::TKN_EOF)
1210
+ if (tkn.kind != web::json::details::JSON_Parser<CharType >::Token::TKN_EOF)
1208
1211
{
1209
1212
returnObject = web::json::value ();
1210
1213
web::json::details::SetErrorCode (tkn, web::json::details::json_error::left_over_character_in_stream);
@@ -1213,53 +1216,12 @@ static web::json::value _parse_narrow_stream(std::istream& stream, std::error_co
1213
1216
error = std::move (tkn.m_error );
1214
1217
return returnObject;
1215
1218
}
1216
- #endif
1217
1219
1218
- web::json::value web::json::value::parse (const utility::string_t & str)
1219
- {
1220
- web::json::details::JSON_StringParser<utility::char_t > parser (str);
1221
- web::json::details::JSON_Parser<utility::char_t >::Token tkn;
1222
-
1223
- parser.GetNextToken (tkn);
1224
- if (tkn.m_error )
1225
- {
1226
- web::json::details::CreateException (tkn, utility::conversions::to_string_t (tkn.m_error .message ()));
1227
- }
1228
-
1229
- auto value = parser.ParseValue (tkn);
1230
- if (tkn.m_error )
1231
- {
1232
- web::json::details::CreateException (tkn, utility::conversions::to_string_t (tkn.m_error .message ()));
1233
- }
1234
- else if (tkn.kind != web::json::details::JSON_Parser<utility::char_t >::Token::TKN_EOF)
1235
- {
1236
- web::json::details::CreateException (tkn,
1237
- _XPLATSTR (" Left-over characters in stream after parsing a JSON value" ));
1238
- }
1239
- return value;
1240
- }
1220
+ web::json::value web::json::value::parse (const utility::string_t & str) { return _parse_string (str); }
1241
1221
1242
1222
web::json::value web::json::value::parse (const utility::string_t & str, std::error_code& error)
1243
1223
{
1244
- web::json::details::JSON_StringParser<utility::char_t > parser (str);
1245
- web::json::details::JSON_Parser<utility::char_t >::Token tkn;
1246
-
1247
- parser.GetNextToken (tkn);
1248
- if (tkn.m_error )
1249
- {
1250
- error = std::move (tkn.m_error );
1251
- return web::json::value ();
1252
- }
1253
-
1254
- auto returnObject = parser.ParseValue (tkn);
1255
- if (tkn.kind != web::json::details::JSON_Parser<utility::char_t >::Token::TKN_EOF)
1256
- {
1257
- returnObject = web::json::value ();
1258
- web::json::details::SetErrorCode (tkn, web::json::details::json_error::left_over_character_in_stream);
1259
- }
1260
-
1261
- error = std::move (tkn.m_error );
1262
- return returnObject;
1224
+ return _parse_string (str, error);
1263
1225
}
1264
1226
1265
1227
web::json::value web::json::value::parse (utility::istream_t & stream) { return _parse_stream (stream); }
@@ -1270,10 +1232,17 @@ web::json::value web::json::value::parse(utility::istream_t& stream, std::error_
1270
1232
}
1271
1233
1272
1234
#ifdef _WIN32
1273
- web::json::value web::json::value::parse (std::istream& stream) { return _parse_narrow_stream (stream); }
1235
+ web::json::value web::json::value::parse (const std::string& str) { return _parse_string (str); }
1236
+
1237
+ web::json::value web::json::value::parse (const std::string& str, std::error_code& error)
1238
+ {
1239
+ return _parse_string (str, error);
1240
+ }
1241
+
1242
+ web::json::value web::json::value::parse (std::istream& stream) { return _parse_stream (stream); }
1274
1243
1275
1244
web::json::value web::json::value::parse (std::istream& stream, std::error_code& error)
1276
1245
{
1277
- return _parse_narrow_stream (stream, error);
1246
+ return _parse_stream (stream, error);
1278
1247
}
1279
1248
#endif
0 commit comments