Json读写共用内部字符串缓冲区,每一个Json片段就是一截字符串,可输出,读取单元测试通过
This commit is contained in:
parent
4360882033
commit
6234271a3c
|
@ -7,10 +7,10 @@ static int find(cstring str, int len, char ch);
|
|||
static const Json Null(nullptr);
|
||||
|
||||
// 构造只读实例
|
||||
Json::Json(cstring str) :_str(str) { _writer = nullptr; }
|
||||
Json::Json(cstring str, int len) : _str(str, len) { _writer = nullptr; }
|
||||
Json::Json(cstring str) :_str(str) { }
|
||||
Json::Json(cstring str, int len) : _str(str, len) { }
|
||||
|
||||
Json::Json(const String& value) : _str(value) { _writer = nullptr; }
|
||||
Json::Json(const String& value) : _str(value) { }
|
||||
|
||||
// 值类型
|
||||
JsonType Json::Type() const
|
||||
|
@ -132,9 +132,9 @@ Json Json::Find(cstring key) const {
|
|||
// 找到结尾
|
||||
switch (val[0])
|
||||
{
|
||||
case '{': n = find(val, n, '}'); break;
|
||||
case '[': n = find(val, n, ']'); break;
|
||||
case '"': n = find(val, n, '"'); break;
|
||||
case '{': n = find(val, n, '}') + 1; break;
|
||||
case '[': n = find(val, n, ']') + 1; break;
|
||||
case '"': n = find(val, n, '"') + 1; break;
|
||||
// 其它类型只需要逗号,如果没有逗号,就可能是最后一个了
|
||||
default: {
|
||||
auto ve = val + n;
|
||||
|
@ -220,7 +220,10 @@ const Json Json::operator[](int index) const {
|
|||
if (p < 0)
|
||||
{
|
||||
// 最后没找到逗号,如果刚好index为0,说明是最后一段
|
||||
if (index == 0) return Json(cs, len);
|
||||
if (index == 0) {
|
||||
if (cs[len - 1] == ']') len--;
|
||||
return Json(cs, len);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (index-- == 0) return Json(cs, p);
|
||||
|
@ -238,12 +241,12 @@ const Json Json::operator[](int index) const {
|
|||
}*/
|
||||
|
||||
Json::Json() {
|
||||
_writer = &_str;
|
||||
//_writer = &_str;
|
||||
}
|
||||
|
||||
// 设置输出缓冲区
|
||||
Json::Json(String& writer) :_str(writer) {
|
||||
_writer = &writer;
|
||||
//_writer = &writer;
|
||||
}
|
||||
|
||||
Json::Json(bool value) : _str(value) { }
|
||||
|
@ -251,13 +254,13 @@ Json::Json(int value) : _str(value) { }
|
|||
Json::Json(float value) : _str(value) { }
|
||||
Json::Json(double value) : _str(value) { }
|
||||
|
||||
void Json::Check() {
|
||||
/*void Json::Check() {
|
||||
if (!_writer) _writer = new String();
|
||||
}
|
||||
}*/
|
||||
|
||||
// 添加对象成员
|
||||
Json& Json::Add(cstring key, const Json& value) {
|
||||
auto& s = *_writer;
|
||||
auto& s = _str;
|
||||
// 如果已经有数据,则把最后的括号改为逗号
|
||||
if (s.Length() > 0)
|
||||
s[s.Length() - 1] = ',';
|
||||
|
@ -277,7 +280,7 @@ Json& Json::Add(cstring key, const Json& value) {
|
|||
|
||||
// 添加数组成员
|
||||
Json& Json::Add(const Json& value) {
|
||||
auto& s = *_writer;
|
||||
auto& s = _str;
|
||||
// 如果已经有数据,则把最后的括号改为逗号
|
||||
if (s.Length() > 0)
|
||||
s[s.Length() - 1] = ',';
|
||||
|
@ -300,10 +303,14 @@ Json Json::AddArray(cstring key) {
|
|||
}
|
||||
|
||||
String Json::ToString() const {
|
||||
String str;
|
||||
if (_writer) str += *_writer;
|
||||
//String str;
|
||||
//if (_writer) str += *_writer;
|
||||
|
||||
return str;
|
||||
return _str;
|
||||
}
|
||||
|
||||
void Json::Show(bool newline) const {
|
||||
_str.Show(newline);
|
||||
}
|
||||
|
||||
static bool isSpace(char ch) {
|
||||
|
|
|
@ -72,6 +72,7 @@ public:
|
|||
Json AddArray(cstring key);
|
||||
|
||||
String ToString() const;
|
||||
void Show(bool newline = false) const;
|
||||
|
||||
#if DEBUG
|
||||
static void Test();
|
||||
|
@ -79,7 +80,7 @@ public:
|
|||
|
||||
private:
|
||||
String _str;
|
||||
String* _writer; // 仅用于写入处理的字符串指针
|
||||
//String* _writer; // 仅用于写入处理的字符串指针
|
||||
|
||||
void Init(cstring str, int len);
|
||||
Json Find(cstring key) const;
|
||||
|
|
|
@ -23,21 +23,26 @@ static void TestRead()
|
|||
assert(json.Type() == JsonType::object, "Type()");
|
||||
|
||||
auto id = json["id"];
|
||||
debug_printf("id="); id.Show(true);
|
||||
assert(id.Type() == JsonType::integer, "Type()");
|
||||
assert(id.AsInt() == 3141, "AsInt()");
|
||||
|
||||
auto name = json["name"];
|
||||
debug_printf("name="); name.Show(true);
|
||||
assert(name.Type() == JsonType::string, "Type()");
|
||||
assert(name.AsString() == "Smart \\\" Stone", "AsString()");
|
||||
|
||||
auto enable = json["enable"];
|
||||
debug_printf("enable="); enable.Show(true);
|
||||
assert(enable.Type() == JsonType::boolean, "Type()");
|
||||
assert(enable.AsBoolean() == true, "AsBoolean()");
|
||||
|
||||
auto noval = json["noval"];
|
||||
debug_printf("noval="); noval.Show(true);
|
||||
assert(noval.Type() == JsonType::null, "Type()");
|
||||
|
||||
auto score = json["score"];
|
||||
debug_printf("score="); score.Show(true);
|
||||
assert(score.Type() == JsonType::Float, "Type()");
|
||||
float v = score.AsFloat();
|
||||
String s(v);
|
||||
|
@ -49,21 +54,26 @@ static void TestRead()
|
|||
assert(score.AsDouble() == 3.14159, "AsFloat()");
|
||||
|
||||
auto array = json["array"];
|
||||
debug_printf("array="); array.Show(true);
|
||||
assert(array.Type() == JsonType::array, "Type()");
|
||||
assert(array.Length() == 3, "Length()");
|
||||
|
||||
auto arr2 = array[2];
|
||||
debug_printf("array[2]="); arr2.Show(true);
|
||||
assert(arr2.Type() == JsonType::integer, "Type()");
|
||||
assert(arr2.AsInt() == 2, "AsInt()");
|
||||
|
||||
auto extend = json["extend"];
|
||||
debug_printf("extend="); extend.Show(true);
|
||||
assert(extend.Type() == JsonType::object, "Type()");
|
||||
|
||||
auto kind = extend["kind"];
|
||||
debug_printf("kind="); kind.Show(true);
|
||||
assert(kind.Type() == JsonType::string, "Type()");
|
||||
assert(kind.AsString() == "cost", "AsString()");
|
||||
|
||||
auto value = extend["value"];
|
||||
debug_printf("value="); value.Show(true);
|
||||
assert(value.Type() == JsonType::Float, "Type()");
|
||||
float v3 = value.AsFloat();
|
||||
String s3(v3);
|
||||
|
|
Loading…
Reference in New Issue