nlohmann json использует метод .at () для вектора индексов - PullRequest
0 голосов
/ 15 апреля 2020

Я уже некоторое время пользуюсь библиотекой nlohmann json, но недавно у меня возникла проблема. У меня есть вектор индексов для объекта:

vector<string> indexes = {"value1", "subval"}; // etc

, и я хочу сделать что-то вроде этого:

json myObj = "{\"value1\":{}}"_json;
myObj["value1"]["subval"] = "test";

Как я могу это сделать?

I попробовал это:

json myObj = "{\"value1\":{}}"_json;
json ref = myObj;

for (string i : indexes) {
  ref = ref[i];
}

myObj = ref;

, но это не будет работать, потому что он не обращается к вложенным элементам, он просто устанавливает объект в качестве вложенного значения.

1 Ответ

1 голос
/ 15 апреля 2020

json ref = myObj;

Когда вы делаете это, вы должны понимать, что ref не является ссылкой или указателем, что бы вы ни хотели. Это копия .

Решение: попробуйте вместо этого использовать reference_wrapper .

     vector<string> indexes = {"value1", "subval"};                                                                                                                                                         
     json myObj;                                                                                                                                                                                            
     auto ref = std::ref(myObj);                                                                                                                                                                            

     for (string i : indexes) {                                                                                                                                                                             
         ref = ref.get()[i];                                                                                                                                                                                
     }                                                                                                                                                                                                      
     ref.get() = "test";                                                                                                                                                                                                   
     std::cout << myObj << std::endl;

Или вместо reference_wrapper, вы также можете использовать указатель. Ваш ш sh. A json& ref, очевидно, не будет работать - вы не можете переназначить ссылку, а следовательно, reference_wrapper.

...