Russian Qt Forum
Ноябрь 24, 2024, 08:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Объдинение двух Json обьектов  (Прочитано 7574 раз)
DenKor29
Гость
« : Июль 27, 2015, 08:35 »

Читаю документацию и не могу понять каким образом можно:

1. Объединить два объекта с перезаписью общих ключей.
2. Имея два объекта получить третий обьект, дополняющий второй до первого.


Пример, что нужно сделать для объдинение 1 и 2 объектов.

Код:

{
  "Comment":"My comment",
  "Count":10,
  "DiskParam":
  {
    "DB":10.000000,
    "DBAngle":1.234000
  }
}



{
  "Comment":"My comment",
  "Count":20
}


{
  "Comment":"My comment",
  "Count":20,
  "DiskParam":
  {
    "DB":10.000000,
    "DBAngle":1.234000
  }
}



Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Июль 27, 2015, 09:56 »

Сделайте вручную Улыбающийся
Если уровней вложенности 1-2, то будет несложно
Записан

DenKor29
Гость
« Ответ #2 : Июль 27, 2015, 10:37 »

Мне нужно это сделать в общем случае. Велосипед изобретать не хочется ....
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Июль 27, 2015, 13:56 »

Навелосипедил немного Улыбающийся Алгоритм нужно тестить, а так, вроде бы работает Улыбающийся
Сделал на питоне, но алгоритм будет такой же и для с++

Код
Javascript
{
  "Comment":"My comment",
  "Count":10,
  "Errors": null,
  "DiskParam":
  {
    "DB":10.000000,
    "DBAngle":1.234000
  }
}
 
{
 "Comment":"My super comment!",
 "Count":20,
 "Errors": "@##@##%!",
 "DiskParam":
 {
   "DB":42,
   "Foo": [1, 2, 3, 4]
 }
}

Питоничий json-сериализатор парсит строку в стандартные питоничьи типы: dict, list, None, False, True, int, float, str, поэтому в функцию попадают 2 dict.
Слияние идет от второго в первый словарь.
В цикле перебираются все элементы и возвращаются их ключ (k) и значение (v)
В условии мы проверяем что ключ k есть у первого словаря и то, что значениями словарей j1 и j2 являются словари (json object), тогда вызываем сами себя
Если условие не совпало, просто добавляем / переписываем значение под ключом k. Добавляем, если такого ключа нет в словаре, и переписываем если есть

https://github.com/gil9red/SimplePyScripts/blob/master/jsonmerge.py
Код
Python
def jsonmerge(j1, j2):
   for k, v in j2.items():
       if k in j1 and isinstance(j1[k], dict) and isinstance(v, dict):
           jsonmerge(j1[k], v)
       else:
           j1[k] = v


Результат:
Код
Javascript
{
   "Errors": "@##@##%!",
   "Comment": "My super comment!",
   "DiskParam": {
       "DB": 42,
       "DBAngle": 1.234,
       "Foo": [1, 2, 3, 4]
   },
   "Count": 20
}
 
« Последнее редактирование: Июль 27, 2015, 13:58 от gil9red » Записан

DenKor29
Гость
« Ответ #4 : Июль 27, 2015, 14:15 »

Спасибо. Но я питон не знаю.

Можно пример на c++ и классов Json.   Улыбающийся
Записан
DenKor29
Гость
« Ответ #5 : Июль 28, 2015, 09:44 »

Все оказалось проще чем я думал. Может кому пригодится.

Код:
QJsonObject merge(QJsonObject obj1, QJsonObject obj2)
{
QJsonObject obj;

obj = obj1;

QStringList keys = obj2.keys();

foreach (QString key,keys)

{
if (obj2[key].isObject())
obj[key] = merge(obj[key].toObject(),obj2[key].toObject());
else obj[key] = obj2[key];
}

return obj;
}
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Июль 28, 2015, 10:23 »

Молодец Улыбающийся

Проверьте алгоритм для этих json'ов Подмигивающий
Код
Javascript
{
  "Comment":"My comment"
}
 
{
 "Comment":"My super comment!",
 "Count":20
}
 
Записан

DenKor29
Гость
« Ответ #7 : Июль 29, 2015, 17:12 »

А в чем подвох ? Будет

{
        {"Comment","My super comment"},
        {"Count", 20}
}



Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Июль 29, 2015, 20:45 »

А в чем подвох ? Будет

{
        {"Comment","My super comment"},
        {"Count", 20}
}

По-идеи, в строке obj[key] = merge(obj[key].toObject(),obj2[key].toObject()); случится фигня, потому что в словаре obj не будет такого ключа
Записан

DenKor29
Гость
« Ответ #9 : Июль 30, 2015, 08:10 »

Фигни не будет так как в этом случае obj[key].toObject() вернет ссылку на пустой объект.
Что довольно логично ...
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Июль 30, 2015, 08:33 »

Ну раз он не null возвращает, то да Улыбающийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 23.