有没有办法在 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;
}

CTYPEDIRVIEWJSONFILE 是由 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"] 时,arrJson::Valuea 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
}