完成数组的元素计数和取值
This commit is contained in:
parent
6e32415ef7
commit
c3aeb89bbd
200
Message/Json.cpp
200
Message/Json.cpp
|
@ -1,5 +1,9 @@
|
||||||
#include "Json.h"
|
#include "Json.h"
|
||||||
|
|
||||||
|
static bool isSpace(char ch);
|
||||||
|
static cstring SkipSpace(cstring str, int& len);
|
||||||
|
static int find(cstring str, int len, char ch);
|
||||||
|
|
||||||
static const Json Null;
|
static const Json Null;
|
||||||
|
|
||||||
Json::Json() { Init(nullptr, 0); }
|
Json::Json() { Init(nullptr, 0); }
|
||||||
|
@ -11,8 +15,10 @@ Json::Json(cstring str)
|
||||||
|
|
||||||
void Json::Init(cstring str, int len)
|
void Json::Init(cstring str, int len)
|
||||||
{
|
{
|
||||||
_str = str;
|
//_str = str;
|
||||||
_len = len;
|
_len = len;
|
||||||
|
|
||||||
|
_str = SkipSpace(str, _len);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 值类型
|
// 值类型
|
||||||
|
@ -116,100 +122,6 @@ double Json::AsDouble() const
|
||||||
return s.ToDouble();
|
return s.ToDouble();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSpace(char ch)
|
|
||||||
{
|
|
||||||
return ch == ' ' ||
|
|
||||||
ch == '\t' ||
|
|
||||||
ch == '\r' ||
|
|
||||||
ch == '\n';
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 跳过空格
|
|
||||||
cstring SkipSpace(cstring str)
|
|
||||||
{
|
|
||||||
while(isSpace(str[0])) str++;
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 读取对象结尾
|
|
||||||
int readObject(cstring str, int len)
|
|
||||||
{
|
|
||||||
// { ... }
|
|
||||||
if(str[0] != '{') return 0;
|
|
||||||
|
|
||||||
// 记录括号配对
|
|
||||||
int m = 0;
|
|
||||||
// 是否在字符串中,此时不算括号
|
|
||||||
bool s = false;
|
|
||||||
for(int i=0; i<len; i++)
|
|
||||||
{
|
|
||||||
switch(str[i])
|
|
||||||
{
|
|
||||||
case '{': if(!s) m++; break;
|
|
||||||
case '}': {
|
|
||||||
if(!s) m--;
|
|
||||||
if(!m) return i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case '"': {
|
|
||||||
if(str[i-1] != '\\') s = !s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 读取数组结尾
|
|
||||||
int readArray(cstring str, int len)
|
|
||||||
{
|
|
||||||
// [ ... ]
|
|
||||||
if(str[0] != '[') return 0;
|
|
||||||
|
|
||||||
// 记录括号配对
|
|
||||||
int m = 0;
|
|
||||||
// 是否在字符串中,此时不算括号
|
|
||||||
bool s = false;
|
|
||||||
for(int i=0; i<len; i++)
|
|
||||||
{
|
|
||||||
switch(str[i])
|
|
||||||
{
|
|
||||||
case '[': if(!s) m++; break;
|
|
||||||
case ']': {
|
|
||||||
if(!s) m--;
|
|
||||||
if(!m) return i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case '"': {
|
|
||||||
if(str[i-1] != '\\') s = !s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 读取字符串结尾
|
|
||||||
int readString(cstring str, int len)
|
|
||||||
{
|
|
||||||
// " ..\".. "
|
|
||||||
if(str[0] != '"') return 0;
|
|
||||||
|
|
||||||
// 找到第一个不是转义的双引号
|
|
||||||
for(int i=1; i<len; i++)
|
|
||||||
{
|
|
||||||
switch(str[i])
|
|
||||||
{
|
|
||||||
case '"': {
|
|
||||||
if(str[i-1] != '\\') return i + 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 读取成员。找到指定成员,并用它的值构造一个新的对象
|
// 读取成员。找到指定成员,并用它的值构造一个新的对象
|
||||||
Json Json::operator[](cstring key) const
|
Json Json::operator[](cstring key) const
|
||||||
{
|
{
|
||||||
|
@ -235,14 +147,14 @@ Json Json::operator[](cstring key) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// 跳过可能的空格
|
// 跳过可能的空格
|
||||||
auto val = SkipSpace(_str + p);
|
n = _len - p;
|
||||||
n = _str + _len - val;
|
auto val = SkipSpace(_str + p, n);
|
||||||
// 找到结尾
|
// 找到结尾
|
||||||
switch(val[0])
|
switch(val[0])
|
||||||
{
|
{
|
||||||
case '{': n = readObject(val, n); break;
|
case '{': n = find(val, n, '}'); break;
|
||||||
case '[': n = readArray(val, n); break;
|
case '[': n = find(val, n, ']'); break;
|
||||||
case '"': n = readString(val, n); break;
|
case '"': n = find(val, n, '"'); break;
|
||||||
// 其它类型只需要逗号,如果没有逗号,就可能是最后一个了
|
// 其它类型只需要逗号,如果没有逗号,就可能是最后一个了
|
||||||
default: {
|
default: {
|
||||||
auto ve = val + n;
|
auto ve = val + n;
|
||||||
|
@ -274,18 +186,100 @@ int Json::Length() const
|
||||||
if(!_str && !_len) return 0;
|
if(!_str && !_len) return 0;
|
||||||
|
|
||||||
if(_str[0] != '[') return 0;
|
if(_str[0] != '[') return 0;
|
||||||
|
if(_len == 2 && _str[1] == ']') return 0;
|
||||||
|
|
||||||
return 0;
|
// 数逗号
|
||||||
|
int n = 0;
|
||||||
|
for(int i=0; i<_len;)
|
||||||
|
{
|
||||||
|
int p = find(_str + i + 1, _len - i - 1, ',');
|
||||||
|
if(p < 0) break;
|
||||||
|
i += p;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数组个数就是逗号个数加一
|
||||||
|
return n + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Json Json::operator[](int index) const
|
Json Json::operator[](int index) const
|
||||||
{
|
{
|
||||||
return *this;
|
Json json;
|
||||||
|
if(!_str && !_len) return json;
|
||||||
|
|
||||||
|
if(_str[0] != '[') return json;
|
||||||
|
if(_len == 2 && _str[1] == ']') return json;
|
||||||
|
|
||||||
|
// 数逗号
|
||||||
|
for(int i=0; i<_len;)
|
||||||
|
{
|
||||||
|
// 找下一个逗号
|
||||||
|
auto s = _str + i + 1;
|
||||||
|
int p = find(s, _len - i - 1, ',');
|
||||||
|
if(p < 0)
|
||||||
|
{
|
||||||
|
// 最后没找到逗号,如果刚好index为0,说明是最后一段
|
||||||
|
if(index == 0) json.Init(s, _len - i - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += p;
|
||||||
|
|
||||||
|
if(index-- == 0)
|
||||||
|
{
|
||||||
|
json.Init(s, p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Json& Json::operator[](int index)
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Json& Json::operator[](int index)
|
||||||
{
|
{
|
||||||
return *this;
|
return *this;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
static bool isSpace(char ch)
|
||||||
|
{
|
||||||
|
return ch == ' ' ||
|
||||||
|
ch == '\t' ||
|
||||||
|
ch == '\r' ||
|
||||||
|
ch == '\n';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 跳过空格
|
||||||
|
static cstring SkipSpace(cstring str, int& len)
|
||||||
|
{
|
||||||
|
while(len && isSpace(str[0])) { str++; len--; }
|
||||||
|
while(len && isSpace(str[len -1])) len--;
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int find(cstring str, int len, char ch)
|
||||||
|
{
|
||||||
|
// 记录大括号、中括号配对
|
||||||
|
int m = 0;
|
||||||
|
int n = 0;
|
||||||
|
// 是否在字符串中,此时不算括号
|
||||||
|
bool s = false;
|
||||||
|
for(int i=0; i<len; i++)
|
||||||
|
{
|
||||||
|
switch(str[i])
|
||||||
|
{
|
||||||
|
case '{': if(!s) m++; break;
|
||||||
|
case '}': if(!s) m--; break;
|
||||||
|
case '[': if(!s) n++; break;
|
||||||
|
case ']': if(!s) n--; break;
|
||||||
|
case '"':
|
||||||
|
if(i == 0 || str[i-1] != '\\') s = !s;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 配对平衡的时候遇到目标,才是结果
|
||||||
|
if(str[i] == ch && m == 0 && n == 0 && !s) return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
JValue::JValue() : type_t(NIL) { }
|
JValue::JValue() : type_t(NIL) { }
|
||||||
|
|
|
@ -48,7 +48,11 @@ static void TestRead()
|
||||||
|
|
||||||
auto array = json["array"];
|
auto array = json["array"];
|
||||||
assert(array.Type() == JsonType::array, "Type()");
|
assert(array.Type() == JsonType::array, "Type()");
|
||||||
//assert(score.Length() == 3, "Length()");
|
assert(array.Length() == 3, "Length()");
|
||||||
|
|
||||||
|
auto arr2 = array[2];
|
||||||
|
assert(arr2.Type() == JsonType::integer, "Type()");
|
||||||
|
assert(arr2.AsInt() == 2, "AsInt()");
|
||||||
|
|
||||||
auto extend = json["extend"];
|
auto extend = json["extend"];
|
||||||
assert(extend.Type() == JsonType::object, "Type()");
|
assert(extend.Type() == JsonType::object, "Type()");
|
||||||
|
|
Loading…
Reference in New Issue