diff --git a/Message/Json.cpp b/Message/Json.cpp index 34554dd8..a9a57a8e 100644 --- a/Message/Json.cpp +++ b/Message/Json.cpp @@ -17,7 +17,7 @@ void Json::Init(cstring str, int len) { //_str = str; _len = len; - + _str = SkipSpace(str, _len); } @@ -122,8 +122,7 @@ double Json::AsDouble() const return s.ToDouble(); } -// 读取成员。找到指定成员,并用它的值构造一个新的对象 -Json Json::operator[](cstring key) const +Json Json::Find(cstring key) const { Json json; if(!_str && !_len) return json; @@ -174,11 +173,21 @@ Json Json::operator[](cstring key) const return json; } +// 读取成员。找到指定成员,并用它的值构造一个新的对象 +const Json Json::operator[](cstring key) const { return Find(key); } + // 设置成员。找到指定成员,或添加成员,并返回对象 -/*Json& Json::operator[](cstring key) +Json& Json::operator[](cstring key) { - return *this; -}*/ + //if(!_s) return Find(key); + + Json json; + + Add(key, json); + json.SetOut(*_s); + + return json; +} // 特殊支持数组 int Json::Length() const @@ -201,7 +210,7 @@ int Json::Length() const return n + 1; } -Json Json::operator[](int index) const +const Json Json::operator[](int index) const { Json json; if(!_str && !_len) return json; @@ -238,6 +247,63 @@ Json Json::operator[](int index) const return *this; }*/ +// 设置输出缓冲区。写入Json前必须设置 +void Json::SetOut(String& result) +{ + _s = &result; +} + +void Json::Check() +{ + if(!_s) _s = new String(); +} + +// 添加对象成员 +Json& Json::Add(cstring key, const Json& value) +{ + auto& s = *_s; + // 如果已经有数据,则把最后的括号改为逗号 + if(s.Length() > 0) + s[s.Length() - 1] = ','; + else + s += '{'; + + s += '"'; + s += key; + s += "\":"; + + //s += value; + value.ToStr(s); + + s += '}'; + + return *this; +} + +// 添加数组成员 +Json& Json::Add(const Json& value) +{ + auto& s = *_s; + // 如果已经有数据,则把最后的括号改为逗号 + if(s.Length() > 0) + s[s.Length() - 1] = ','; + else + s += '['; + + value.ToStr(s); + + s += ']'; + + return *this; +} + +String& Json::ToStr(String& str) const +{ + if(_s) str += *_s; + + return str; +} + static bool isSpace(char ch) { return ch == ' ' || diff --git a/Message/Json.h b/Message/Json.h index 48cd2ad0..7ba8a9df 100644 --- a/Message/Json.h +++ b/Message/Json.h @@ -30,6 +30,13 @@ public: Json(); Json(cstring str); + //Json(const Json& value) = delete; + //Json(Json&& value) = delete; + + Json(int value); + Json(bool value); + Json(double value); + Json(String& value); // 值类型 JsonType Type() const; @@ -42,24 +49,37 @@ public: double AsDouble() const; // 读取成员。找到指定成员,并用它的值构造一个新的对象 - Json operator[](cstring key) const; + const Json operator[](cstring key) const; // 设置成员。找到指定成员,或添加成员,并返回对象 - //Json& operator[](cstring key); + Json& operator[](cstring key); // 特殊支持数组 int Length() const; - Json operator[](int index) const; - Json& operator[](int index); + const Json operator[](int index) const; + //Json& operator[](int index); + + // 设置输出缓冲区。写入Json前必须设置 + void SetOut(String& result); + // 添加对象成员 + Json& Add(cstring key, const Json& value); + // 添加数组成员 + Json& Add(const Json& value); + + virtual String& ToStr(String& str) const; #if DEBUG static void Test(); #endif - + private: cstring _str; int _len; + String* _s; // 仅用于写入处理的字符串指针 void Init(cstring str, int len); + Json Find(cstring key) const; + + void Check(); }; /** Json值类型 */ diff --git a/Test/JsonTest.cpp b/Test/JsonTest.cpp index 19a76537..baa6319d 100644 --- a/Test/JsonTest.cpp +++ b/Test/JsonTest.cpp @@ -2,12 +2,10 @@ #include "Message\Json.h" #if DEBUG -static void TestRead() -{ - Json json = +static cstring jsonstr = "{\ \"id\": 3141, \ - \"name\": \"Stone\", \ + \"name\": \"Smart \\\" Stone\", \ \"enable\": true, \ \"noval\": null, \ \"score\": 3.14159, \ @@ -18,6 +16,10 @@ static void TestRead() }\ }"; +static void TestRead() +{ + Json json = jsonstr; + assert(json.Type() == JsonType::object, "Type()"); auto id = json["id"]; @@ -26,7 +28,7 @@ static void TestRead() auto name = json["name"]; assert(name.Type() == JsonType::string, "Type()"); - assert(name.AsString() == "Stone", "AsString()"); + assert(name.AsString() == "Smart \" Stone", "AsString()"); auto enable = json["enable"]; assert(enable.Type() == JsonType::boolean, "Type()"); @@ -71,6 +73,33 @@ static void TestRead() assert(value.AsFloat() == 67.89f, "AsFloat()"); } +static void TestWrite() +{ + Json json; + String rs; + json.SetOut(rs); + + json["id"] = 3141; + json["name"] = "Smart \" Stone"; + json["enable"] = "true"; + json["noval"] = nullptr; + json["score"] = 3.14159; + + auto arr = json["array"]; + /*arr[0] = 1; + arr[1] = 0; + arr[2] = 2;*/ + arr.Add(1).Add(0).Add(2); + + auto ext = json["extend"]; + ext["kind"] = "cost"; + ext["value"]= 67.89f; + + //auto rs = json.ToString(); + rs.Show(true); + //assert(rs == jsonstr, "ToString()"); +} + void Json::Test() { TS("TestJson"); @@ -78,6 +107,7 @@ void Json::Test() debug_printf("TestJson......\r\n"); TestRead(); + TestWrite(); debug_printf("TestJson 测试完毕......\r\n");