Задать вопрос
@014

Как упростить доступ к json вложенному объекту в Qt?

Есть вот такой json
{
   "firstName": "Иван",
   "lastName": "Иванов",
   "address": {
       "streetAddress": "Московское ш., 101, кв.101",
       "city": "Ленинград",
       "postalCode": 101101
   },
   "phoneNumbers": [
       "812 123-1234",
       "916 123-4567"
   ]
}


что бы изменить значение ключа city приходится делать вот такую конструкцию:

QFile j_file( "file.json" );

   if( !j_file.open( QIODevice::ReadOnly | QIODevice::Text ) )
     qDebug() << "Err open file";

   QJsonDocument j_doc = QJsonDocument::fromJson( j_file.readAll() );

   QJsonObject j_obj = j_doc.object();
   QJsonValue j_val = "Piter";
   QJsonObject jo(j_obj["address"].toObject());
   jo["city"] = j_val;
   j_obj["address"] = jo;


На мой взгляд выглядит это как то коряво, а если вложение еще глубже будет... Подскажите как грамотно получить доступ к нужным ключам.
  • Вопрос задан
  • 841 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@014 Автор вопроса
Нашел функцию которая позволяет легко заходить на любую глубину и модифицировать значения.
void parseJson::modifyJsonValue(QJsonObject &obj, const QString &path, const QJsonValue &newValue)
{
  const int indexOfDot = path.indexOf( '.' );
  qDebug() << indexOfDot;
  const QString propertyName = path.left( indexOfDot );
  qDebug() << propertyName;
  const QString subPath = indexOfDot > 0 ? path.mid(indexOfDot + 1) : QString();

  QJsonValue subValue = obj[ propertyName ];

  if(subPath.isEmpty()) {
  subValue = newValue;
  }
  else {
  QJsonObject obj = subValue.toObject();
  modifyJsonValue(obj,subPath,newValue);
  subValue = obj;
  }

  obj[propertyName] = subValue;
  }
  void modifyJsonValue(QJsonDocument& doc, const QString& path, const QJsonValue& newValue) {
  QJsonObject obj = doc.object();
  modifyJsonValue(obj,path,newValue);
  doc = QJsonDocument(obj);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы