浏览代码

feature: ordered_json

hewei.it 5 年之前
父节点
当前提交
4f7f8beb31
共有 5 个文件被更改,包括 331 次插入338 次删除
  1. 12 7
      docs/apis.md
  2. 71 128
      http/HttpMessage.cpp
  3. 1 2
      http/http_content.cpp
  4. 3 2
      http/http_content.h
  5. 244 199
      utils/json.hpp

+ 12 - 7
docs/apis.md

@@ -14,17 +14,23 @@
 - hv_mkdir
 - stricmp, strcasecmp
 
+### hexport.h
+- HV_EXPORT
+- HV_SOURCE, HV_STATICLIB, HV_EXPORTS
+- EXTERN_C, BEGIN_EXTERN_C, END_EXTERN_C
+- BEGIN_NAMESPACE, END_NAMESPACE, USING_NAMESPACE
+- DEPRECATED
+- DEFAULT
+- ENUM, STRUCT
+- IN, OUT, INOUT
+- OPTIONAL, REQUIRED, REPEATED
+
 ### hdef.h
 - ABS, NABS
 - ARRAY_SIZE
-- BEGIN_EXTERN_C, END_EXTERN_C
-- BEGIN_NAMESPACE, END_NAMESPACE
 - BITSET, BITCLR, BITGET
 - CR, LF, CRLF
-- DEFAULT
-- ENUM, STRUCT
 - FLOAT_EQUAL_ZERO
-- IN, OUT, INOUT
 - INFINITE
 - IS_ALPHA, IS_NUM, IS_ALPHANUM
 - IS_CNTRL, IS_GRAPH
@@ -39,14 +45,13 @@
 - MAX, MIN, LIMIT
 - MAX_PATH
 - NULL, TRUE, FALSE
-- OPTIONAL, REQUIRED, REPEATED
 - SAFE_FREE, SAFE_DELETE, SAFE_DELETE_ARRAY, SAFE_RELEASE
 - STRINGCAT
 - STRINGIFY
 - offsetof, offsetofend
 - container_of
 - prefetch
-- printd
+- printd, printe
 
 ### herr.h
 - hv_strerror

+ 71 - 128
http/HttpMessage.cpp

@@ -3,46 +3,32 @@
 #include <string.h>
 
 #include "htime.h"
+#include "hlog.h"
 #include "http_parser.h" // for http_parser_url
 
 #ifndef WITHOUT_HTTP_CONTENT
 // NOTE: json ignore number/string, 123/"123"
-using nlohmann::detail::value_t;
 
 std::string HttpMessage::GetString(const char* key, const std::string& defvalue) {
     switch (content_type) {
     case APPLICATION_JSON:
     {
-        auto iter = json.find(key);
-        if (iter != json.end()) {
-            switch (iter->type()) {
-            case value_t::null:
-                return "null";
-            case value_t::string:
-                return *iter;
-            case value_t::boolean:
-            {
-                bool b = *iter;
-                return b ? "true" : "false";
-            }
-            case value_t::number_integer:
-            {
-                std::int64_t n = *iter;
-                return hv::to_string(n);
-            }
-            case value_t::number_unsigned:
-            {
-                std::uint64_t n = *iter;
-                return hv::to_string(n);
-            }
-            case value_t::number_float:
-            {
-                double f = *iter;
-                return hv::to_string(f);
-            }
-            default:
-                return defvalue;
-            }
+        auto value = json[key];
+        if (value.is_string()) {
+            return value;
+        }
+        else if (value.is_number()) {
+            return hv::to_string(value);
+        }
+        else if (value.is_null()) {
+            return "null";
+        }
+        else if (value.is_boolean()) {
+            bool b = value;
+            return b ? "true" : "false";
+        }
+        else {
+            return defvalue;
         }
     }
         break;
@@ -71,39 +57,24 @@ std::string HttpMessage::GetString(const char* key, const std::string& defvalue)
 template<>
 int64_t HttpMessage::Get(const char* key, int64_t defvalue) {
     if (content_type == APPLICATION_JSON) {
-        auto iter = json.find(key);
-        if (iter != json.end()) {
-            switch (iter->type()) {
-            case value_t::boolean:
-            {
-                bool b = *iter;
-                return b;
-            }
-            case value_t::number_integer:
-            {
-                std::int64_t n = *iter;
-                return n;
-            }
-            case value_t::number_unsigned:
-            {
-                std::uint64_t n = *iter;
-                return n;
-            }
-            case value_t::number_float:
-            {
-                double f = *iter;
-                return f;
-            }
-            case value_t::string:
-            {
-                std::string str = *iter;
-                return atoll(str.c_str());
-            }
-            default:
-                return defvalue;
-            }
+        auto value = json[key];
+        if (value.is_number()) {
+            return value;
+        }
+        else if (value.is_string()) {
+            std::string str = value;
+            return atoll(str.c_str());
+        }
+        else if (value.is_null()) {
+            return 0;
+        }
+        else if (value.is_boolean()) {
+            bool b = value;
+            return b ? 1 : 0;
+        }
+        else {
+            return defvalue;
         }
-        return defvalue;
     }
     else {
         std::string str = GetString(key);
@@ -114,39 +85,20 @@ int64_t HttpMessage::Get(const char* key, int64_t defvalue) {
 template<>
 double HttpMessage::Get(const char* key, double defvalue) {
     if (content_type == APPLICATION_JSON) {
-        auto iter = json.find(key);
-        if (iter != json.end()) {
-            switch (iter->type()) {
-            case value_t::boolean:
-            {
-                bool b = *iter;
-                return b;
-            }
-            case value_t::number_integer:
-            {
-                std::int64_t n = *iter;
-                return n;
-            }
-            case value_t::number_unsigned:
-            {
-                std::uint64_t n = *iter;
-                return n;
-            }
-            case value_t::number_float:
-            {
-                double f = *iter;
-                return f;
-            }
-            case value_t::string:
-            {
-                std::string str = *iter;
-                return atof(str.c_str());
-            }
-            default:
-                return defvalue;
-            }
+        auto value = json[key];
+        if (value.is_number()) {
+            return value;
+        }
+        else if (value.is_string()) {
+            std::string str = value;
+            return atof(str.c_str());
+        }
+        else if (value.is_null()) {
+            return 0.0f;
+        }
+        else {
+            return defvalue;
         }
-        return defvalue;
     }
     else {
         std::string str = GetString(key);
@@ -157,39 +109,23 @@ double HttpMessage::Get(const char* key, double defvalue) {
 template<>
 bool HttpMessage::Get(const char* key, bool defvalue) {
     if (content_type == APPLICATION_JSON) {
-        auto iter = json.find(key);
-        if (iter != json.end()) {
-            switch (iter->type()) {
-            case value_t::boolean:
-            {
-                bool b = *iter;
-                return b;
-            }
-            case value_t::number_integer:
-            {
-                std::int64_t n = *iter;
-                return n;
-            }
-            case value_t::number_unsigned:
-            {
-                std::uint64_t n = *iter;
-                return n;
-            }
-            case value_t::number_float:
-            {
-                double f = *iter;
-                return f;
-            }
-            case value_t::string:
-            {
-                std::string str = *iter;
-                return getboolean(str.c_str());
-            }
-            default:
-                return defvalue;
-            }
+        auto value = json[key];
+        if (value.is_boolean()) {
+            return value;
+        }
+        else if (value.is_string()) {
+            std::string str = value;
+            return getboolean(str.c_str());
+        }
+        else if (value.is_null()) {
+            return false;
+        }
+        else if (value.is_number()) {
+            return value != 0;
+        }
+        else {
+            return defvalue;
         }
-        return defvalue;
     }
     else {
         std::string str = GetString(key);
@@ -330,7 +266,14 @@ int HttpMessage::ParseBody() {
 #ifndef WITHOUT_HTTP_CONTENT
     switch(content_type) {
     case APPLICATION_JSON:
-        return parse_json(body.c_str(), json);
+    {
+        std::string errmsg;
+        int ret = parse_json(body.c_str(), json, errmsg);
+        if (ret != 0 && errmsg.size() != 0) {
+            hloge("%s", errmsg.c_str());
+        }
+        return ret;
+    }
     case MULTIPART_FORM_DATA:
     {
         auto iter = headers.find("Content-Type");

+ 1 - 2
http/http_content.cpp

@@ -239,10 +239,9 @@ std::string dump_json(Json& json) {
     return json.dump();
 }
 
-std::string g_parse_json_errmsg;
 int parse_json(const char* str, Json& json, std::string& errmsg) {
     try {
-        json = Json::parse(str);
+        json = nlohmann::json::parse(str);
     }
     catch(nlohmann::detail::exception e) {
         errmsg = e.what();

+ 3 - 2
http/http_content.h

@@ -55,9 +55,10 @@ HV_EXPORT int         parse_multipart(std::string& str, MultiPart& mp, const cha
 // https://github.com/nlohmann/json
 #include "json.hpp"
 using Json = nlohmann::json;
-extern std::string g_parse_json_errmsg;
+// using Json = nlohmann::ordered_json;
+
 HV_EXPORT std::string dump_json(Json& json);
-HV_EXPORT int         parse_json(const char* str, Json& json, std::string& errmsg = g_parse_json_errmsg);
+HV_EXPORT int         parse_json(const char* str, Json& json, std::string& errmsg);
 #endif
 
 #endif // HTTP_CONTENT_H_

文件差异内容过多而无法显示
+ 244 - 199
utils/json.hpp


部分文件因为文件数量过多而无法显示