64,670
社区成员
发帖
与我相关
我的任务
分享
JsonItem* ParseJSArray(CLex& lex);
JsonItem* ParseJSObject(CLex& lex);
static JsonItem* ParseJSItem(CLex& lex)
{
CToken tk = lex.get_token_no_lfeed();
if (tk.is_number())
{
return new JsonItemInt((int)tk.get_number());
}
else if (tk.is_float())
{
return new JsonItemDouble(tk.get_double());
}
else if (tk.is_string())
{
return new JsonItemString(tk.get_string());
}
else if (tk.is_operator(CTokenType::OpBracketLeft))
{
return ParseJSArray(lex);
}
else if (tk.is_operator(CTokenType::OpBraceLeft))
{
return ParseJSObject(lex);
}
else if (tk.is_identifier())
{
if (tk.get_string() == L"true" || tk.get_string() == L"false")
{
return new JsonItemBool(tk.get_string() == L"true");
}
else if (tk.get_string() == L"null")
{
return new JsonItem();
}
}
return nullptr;
}
JsonItem* ParseJSArray(CLex& lex)
{
JsonItemArray* array = new JsonItemArray;
CToken tk = lex.get_token_no_lfeed();
while (!tk.is_operator(CTokenType::OpBracketRight))
{
lex.put_back(tk);
JsonItem* item = ParseJSItem(lex);
if (item == nullptr)
{
delete array;
return nullptr;
}
array->push(item);
tk = lex.get_token_no_lfeed();
if (tk.is_operator(CTokenType::OpBracketRight))
{
return array;
}
if (!tk.is_operator(CTokenType::OpComma))
{
delete array;
return nullptr;
}
tk = lex.get_token_no_lfeed();
}
return array;
}
JsonItem* ParseJSObject(CLex& lex)
{
JsonItemObject* dict = new JsonItemObject;
CToken tk = lex.get_token_no_lfeed();
while (!tk.is_operator(CTokenType::OpBraceRight))
{
std::wstring name;
if (tk.is_identifier() || tk.is_string())
{
name = tk.get_string();
}
else
{
delete dict;
return nullptr;
}
tk = lex.get_token_no_lfeed();
if (!tk.is_operator(CTokenType::OpColon))
{
delete dict;
return nullptr;
}
JsonItem* item = ParseJSItem(lex);
if (item == nullptr)
{
delete dict;
return nullptr;
}
dict->add_child(name, item);
tk = lex.get_token_no_lfeed();
if (tk.is_operator(CTokenType::OpBraceRight))
{
return dict;
}
if (!tk.is_operator(CTokenType::OpComma))
{
delete dict;
return nullptr;
}
tk = lex.get_token_no_lfeed();
}
return dict;
}
JsonItemPtr ParseJSCode(const std::wstring& json)
{
if (json.empty())
{
return nullptr;
}
CLex lex;
if (!lex.load_data(json))
{
return nullptr;
}
return JsonItemPtr(ParseJSItem(lex));
}