2016-12-22 1 views
2

Я использую библиотеку RAB Casablanca C++ для работы с данными JSON. Это код, который я использую для создания нового объекта JSON с нуля, и добавьте пары ключей-значений.Как добавить новые пары ключ-значение в существующий объект web :: json :: value с использованием Casablanca?

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 к некоторому существующему значению, используя следующую строку:

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

Я получаю json::exception как только я пытаюсь получить доступ temp с оператором [] (с использованием либо из двух методов, которые я использую выше).

Как я могу достичь того, что мне нужно? Я искал SO, но я не нашел конкретных ответов Касабланки на мой вопрос.

ответ

0

Я нашел обходное решение, которое работает для меня, но я не уверен, что это хороший подход. В ожидании других ответов, но это может помочь тем, кто достигает этого вопроса.

Обходной путь заключается в создании нового объекта и добавлении новой пары ключ-значение, а затем итерации над старым объектом и добавлении всех ключей один за другим. Это, вероятно, имеет довольно плохую производительность.

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^