1

私はこのデータセットを持っています:

[ step:-1, name:"BaseName1",  value:v1 ]
[ step:-1, name:"BaseName2",  value:v2 ]
[ step:2,  name:"ParamName3", value:v3 ]
[ step:2,  name:"ParamName4", value:v4 ]
[ step:0,  name:"ParamName5", value:v5 ]
[ step:0,  name:"ParamName6", value:v6 ]
[ step:1,  name:"ParamName7", value:v7 ]
[ step:1,  name:"ParamName8", value:v8 ]

次のように、QVariant に変換したいと思います。

[
    "BaseName1": v1,
    "BaseName2": v2,
    "steps": [{
            "ParamName5": v5,
            "ParamName6": v6
        }, {
            "ParamName7": v7,
            "ParamName8": v8
        }, {
            "ParamName3": v3,
            "ParamName4": v4
        }
    ]
]

私はそれが次のようであるべきだと考えました:

QVariantMap params;
params["Base_param_1"] = value;
params["Base_param_2"] = value2;
params["steps"] = QVariantList();

しかし、配列の場合、データを順序付けする必要があります。つまり、ステップ 1 と 3 のparams["steps"] 前にステップ 0 を挿入する必要があります (ステップ 2 は空にする必要があります)。
また、入力データのソートはオプションではありません。

私は次のコードでこれを実装しようとしました:

struct Params{ 
    QString name;  
    QVariant value; 
    int step;/* -1 for base param */ 
};
QList<Params> _params = (...);

QVariantMap v_settings;
QVariantList v_steps;

for(int i=0; i<_params.size(); i++){
    const Param &param = _params[i];

    if( param.index == -1 ){
        v_settings.insert(param.name, param.value);
    }
    else {
        // if list too small, append empties to the list until it exists
        while( v_steps.size() < param.index ){
            QVariantMap map;
            v_steps.append(map);
        }

        v_steps.at(param.index).toMap().insert(param.name, param.value);
    }
}
v_settings.insert("steps", v_steps);

しかし、次の行に遭遇すると、コードはある時点で範囲外のインデックスで失敗します。

v_steps.at(param.index).toMap().insert(param.name, param.value);

したがって、「空のマップで埋める」ループが何らかの形で失敗したと思います。ここはどうすればいいですか?

4

1 に答える 1