2016-12-22 6 views
2

私はCasablanca C++ RESTライブラリを使用してJSONデータを処理しています。これは、最初から新しいJSONオブジェクトを作成し、キーと値のペアを追加するために使用しているコードです。カサブランカを使用して既存のweb :: json :: valueオブジェクトに新しいキーと値のペアを追加する方法は?

web::json::value temp; 

// 1 - to add literal key-value pairs 
temp[L"key1"] = web::json::value::string(U("value1")); 

// 2 - to add key-value pairs of variables whose values I don't know, and are passed as std::string 
temp[utility::conversions::to_string_t(key2)] = web::json::value::string(utility::conversions::to_string_t(value2)); 

これは完全にうまく動作し、新しいオブジェクトに使用して、必要なだけ多くのキーと値のペアを追加できます。

私の問題は、私は、既存のweb::json::value対象に、代わりにゼロから新しいものを作成するのでアペンドにこれらのキーを必要とするということです。私は既存のオブジェクトの構造を知らないので、コードはキーに対応する値を更新するか(存在する場合)、または新しいキーと値のペアを(存在しない場合)追加する必要があります。

私はこの行を使用して、いくつかの既存の値にtempを割り当てることを除いて同じコード、試してみてください。私はできるだけ早く私は(どちらか使用してオペレータ[]tempにアクセスしようとしてjson::exceptionを取得

web::json::value temp = m_value; //m_value is an existing object 

を私が上で使用した2つの方法のうちの1つ)。

私は必要なものをどのように達成できますか?私はSOを検索しましたが、私の質問に対するカサブランカ固有の答えは見つかりませんでした。

答えて

0

私にはうまくいく回避策が見つかりましたが、これは良いアプローチであるとは確信していません。他の回答を待っていますが、これはこの質問に達する人を助けるかもしれません。

回避策は、新しいオブジェクトを作成し、新しいキーと値のペアを追加した後、古いオブジェクトを反復し、すべてのキーを1つずつ追加することです。これはおそらくかなりのパフォーマンスが悪いです。

web::json::value temp; 
temp[key] = web::json::value::string(newvalue); // key and newvalue are of type utility::string_t 

// m_value is the web::json::value which currently holds data 
for (auto iter = m_value.as_object().cbegin(); iter != m_value.as_object().cend(); ++iter) 
{ 
    const std::string jsonKey = utility::conversions::to_utf8string(iter->first); 
    const web::json::value &jsonVal = iter->second; 
    temp[utility::conversions::to_string_t(jsonKey)] = jsonVal; 
} 

m_value = temp; 
関連する問題