From 0908b71e83c7055a1f2a07e1d6e247e29cf2079c Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 23 Nov 2018 10:54:12 +0800 Subject: [PATCH] 1 --- a8/mutable_xobject.cc | 6 +++--- a8/mutable_xobject.h | 4 ++-- a8/xobject.cc | 33 +++++++++++++++++++++++++++++++++ a8/xobject.h | 2 ++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/a8/mutable_xobject.cc b/a8/mutable_xobject.cc index 7e48f5b..2a93d90 100644 --- a/a8/mutable_xobject.cc +++ b/a8/mutable_xobject.cc @@ -24,7 +24,7 @@ namespace a8 return obj; } - a8::MutableXObject& MutableXObject::SetVal(int i, a8::XValue val) + a8::MutableXObject& MutableXObject::Push(a8::XValue val) { if (type_ != XOT_ARRAY) { abort(); @@ -33,13 +33,13 @@ namespace a8 return *this; } - a8::MutableXObject& MutableXObject::SetVal(int i, a8::MutableXObject&& val) + a8::MutableXObject& MutableXObject::Push(a8::MutableXObject& val) { if (type_ != XOT_ARRAY) { abort(); } std::shared_ptr p = std::make_shared(); - *p.get() = val; + val.Move(*p.get()); value_.array_value->push_back(p); return *this; } diff --git a/a8/mutable_xobject.h b/a8/mutable_xobject.h index 3f542bd..9175361 100644 --- a/a8/mutable_xobject.h +++ b/a8/mutable_xobject.h @@ -14,8 +14,8 @@ namespace a8 static a8::MutableXObject* NewObject(); static a8::MutableXObject* NewArray(); - a8::MutableXObject& SetVal(int i, a8::XValue val); - a8::MutableXObject& SetVal(int i, a8::MutableXObject&& val); + a8::MutableXObject& Push(a8::XValue val); + a8::MutableXObject& Push(a8::MutableXObject& val); a8::MutableXObject& SetVal(const std::string& key, a8::XValue val); a8::MutableXObject& SetVal(const std::string& key, a8::XObject& val); a8::MutableXObject& SetVal(const std::string& key, a8::MutableXObject& val); diff --git a/a8/xobject.cc b/a8/xobject.cc index d157d21..de15fff 100644 --- a/a8/xobject.cc +++ b/a8/xobject.cc @@ -107,6 +107,16 @@ namespace a8 } } + a8::XValue XObject::Get(const std::string& key, a8::XValue defval) + { + if (type_ == XOT_OBJECT) { + auto itr = value_.object_value->find(key); + return itr != value_.object_value->end() ? itr->second->AsXValue() : defval; + } else { + return defval; + } + } + bool XObject::HasKey(const std::string& key) { assert(type_ == XOT_OBJECT); @@ -211,6 +221,29 @@ namespace a8 return true; } + void XObject::ReadFromUrlQueryString(const std::string& query_string) + { + type_ = a8::XOT_OBJECT; + value_.object_value = new std::map>(); + + std::vector params; + a8::Split(query_string, params, '&'); + for(unsigned int i = 0; i < params.size(); i++){ + int pos = params[i].find('='); + if(pos > 0){ + std::string key = params[i].substr(0, pos); + std::string val = params[i].substr(pos + 1, params[i].size() - pos); + val = a8::UrlDecode(val); + { + std::shared_ptr xobj_ptr = std::make_shared(); + xobj_ptr->type_ = a8::XOT_SIMPLE; + xobj_ptr->value_.x_value = new a8::XValue(val); + (*value_.object_value)[key] = xobj_ptr; + } + } + } + } + void XObject::ToJsonStr(std::string& data) { if (type_ == a8::XOT_SIMPLE) { diff --git a/a8/xobject.h b/a8/xobject.h index 1baa3f9..61fb16a 100644 --- a/a8/xobject.h +++ b/a8/xobject.h @@ -33,6 +33,7 @@ namespace a8 std::shared_ptr operator[] (const std::string& key); std::shared_ptr At(int i); std::shared_ptr At(const std::string& key); + a8::XValue Get(const std::string& key, a8::XValue defval=""); bool HasKey(const std::string& key); bool HasKey(int i); const a8::XObject& operator=(const a8::XObject& obj); @@ -42,6 +43,7 @@ namespace a8 bool ReadFromJsonString(const std::string& jsondata); bool ReadFromXmlFile(const std::string& filename); bool ReadFromXmlString(const std::string& xmldata); + void ReadFromUrlQueryString(const std::string& query_string); void ToJsonStr(std::string& data); void ToUrlEncodeStr(std::string& data);