有没有办法在 jsoncpp 中使用变量作为键?
Is there a way to use variable as the key in jsoncpp?
我编写了一个函数来将目录结构保存到 json file.I我正在使用 Jsoncpp 库进行编码 json.And 我正在使用 c++17.But 它抛出一个 Json::LogicError
。它说“Json::Value::operator[](ArrayIndex)
需要 arrayValue”。这是函数:
void ScanFolder(string path)
{
CTYPE::PFILELIST pfl;
pfl=CTYPE::to(DIRVIEW::LoadDir(path));
JSONFILE::Encode(DIRVIEW::AddPath(path,"fconfig.json"),pfl);
for(const auto&ele : pfl.data)
if(ele.type=="Folder")
ScanFolder(DIRVIEW::AddPath(pfl.current,ele.filename));
return;
}
CTYPE
、DIRVIEW
和 JSONFILE
是由 me.Here 定义的命名空间是 Encode
函数:
namespace JSONFILE
{
void Encode(string filepath,CTYPE::PFILELIST data)
{
Json::StyledWriter writer;
Json::Value arr,obj;
fstream out;
arr["Current_Folder"]=data.current;
int i=0;
for(const auto&ele : data.data)
{
arr["Files"][i]=ele.filename;
obj["Type"]=ele.type;
obj["Icon"]=ele.icon;
arr[ele.filename]=obj;
i++;
}
string jsonstr=writer.write(arr);
out.open(filepath.c_str(),ios::binary|ios::out|ios::trunc);
if(out.is_open())
out<<jsonstr<<endl;
else
return;
return;
}
};
我发现导致错误的代码是arr[ele.filename]=obj;
。当我删除它时,代码works.I检查了ele.filename
的值,它是'一个空变量,它有正确的值,如 'filename.txt'。那么我应该怎么做才能修复它?
正如它所说的那样 - 您正在尝试对非数组的对象执行数组索引。
当你写 arr["Files"]
时,arr
是 Json::Value
,a null object with that key is created for you:
Access an object value by name, create a null member if it does not exist.
所以现在你有一个名为 arr["Files"]
的 Json::Value
,它具有 "null" 类型。
但您的下一步是在 arr["Files"][i]
中将其视为一个数组。那行不通; an array is not created for you:
Access an array element (zero based index ).
If the array contains less than index element, then null value are inserted in the array so that its size is index+1. (You may need to say 'value[0u]' to get your compiler to distinguish this from the operator[] which takes a string.)
(注意这里讨论的是自动插入元素,而不是自动创建数组本身。)
这很容易修复;只需将该对象设为数组即可:
// ** New line here: **
arr["Files"] = Json::Value(Json::arrayValue);
for (const auto& ele : data.data)
{
arr["Files"][i] = ele.filename;
obj["Type"] = ele.type;
obj["Icon"] = ele.icon;
arr[ele.filename] = obj;
i++;
}
下面是这个问题的最小测试用例:
#include <json/value.h>
int main()
{
Json::Value val;
val[0] = "foo"; // This throws Json::LogicError
}
我编写了一个函数来将目录结构保存到 json file.I我正在使用 Jsoncpp 库进行编码 json.And 我正在使用 c++17.But 它抛出一个 Json::LogicError
。它说“Json::Value::operator[](ArrayIndex)
需要 arrayValue”。这是函数:
void ScanFolder(string path)
{
CTYPE::PFILELIST pfl;
pfl=CTYPE::to(DIRVIEW::LoadDir(path));
JSONFILE::Encode(DIRVIEW::AddPath(path,"fconfig.json"),pfl);
for(const auto&ele : pfl.data)
if(ele.type=="Folder")
ScanFolder(DIRVIEW::AddPath(pfl.current,ele.filename));
return;
}
CTYPE
、DIRVIEW
和 JSONFILE
是由 me.Here 定义的命名空间是 Encode
函数:
namespace JSONFILE
{
void Encode(string filepath,CTYPE::PFILELIST data)
{
Json::StyledWriter writer;
Json::Value arr,obj;
fstream out;
arr["Current_Folder"]=data.current;
int i=0;
for(const auto&ele : data.data)
{
arr["Files"][i]=ele.filename;
obj["Type"]=ele.type;
obj["Icon"]=ele.icon;
arr[ele.filename]=obj;
i++;
}
string jsonstr=writer.write(arr);
out.open(filepath.c_str(),ios::binary|ios::out|ios::trunc);
if(out.is_open())
out<<jsonstr<<endl;
else
return;
return;
}
};
我发现导致错误的代码是arr[ele.filename]=obj;
。当我删除它时,代码works.I检查了ele.filename
的值,它是'一个空变量,它有正确的值,如 'filename.txt'。那么我应该怎么做才能修复它?
正如它所说的那样 - 您正在尝试对非数组的对象执行数组索引。
当你写 arr["Files"]
时,arr
是 Json::Value
,a null object with that key is created for you:
Access an object value by name, create a null member if it does not exist.
所以现在你有一个名为 arr["Files"]
的 Json::Value
,它具有 "null" 类型。
但您的下一步是在 arr["Files"][i]
中将其视为一个数组。那行不通; an array is not created for you:
Access an array element (zero based index ).
If the array contains less than index element, then null value are inserted in the array so that its size is index+1. (You may need to say 'value[0u]' to get your compiler to distinguish this from the operator[] which takes a string.)
(注意这里讨论的是自动插入元素,而不是自动创建数组本身。)
这很容易修复;只需将该对象设为数组即可:
// ** New line here: **
arr["Files"] = Json::Value(Json::arrayValue);
for (const auto& ele : data.data)
{
arr["Files"][i] = ele.filename;
obj["Type"] = ele.type;
obj["Icon"] = ele.icon;
arr[ele.filename] = obj;
i++;
}
下面是这个问题的最小测试用例:
#include <json/value.h>
int main()
{
Json::Value val;
val[0] = "foo"; // This throws Json::LogicError
}