Разбор нескольких объектов Json и объединение в один объект JSON в Python - PullRequest
2 голосов
/ 16 октября 2019

У меня есть строка, содержащая несколько jsons. Я хочу преобразовать этот string в один json объект.

Например,

Предполагая следующий вход,

input = """
{
 "a" : {
        "x":"y",
        "w":"z" 
    }
} 

{
"b" : {
       "v":"w",
       "z":"l"
   }
}
"""

Ожидаемый результат будет:
Выход :

{
"a" : {
       "x":"y",
       "w":"z"
   }

"b" : {
       "v":"w",
       "z":"l"
    }
}

Ответы [ 2 ]

3 голосов
/ 16 октября 2019

если мы рассматриваем их как словари и имеем

>>> a = {'a':{'a':1}}
>>> b = {'b':{'b':1}}

, мы можем просто

>>> a.update(b)
>>> a

{'a': {'a': 1}, 'b': {'b': 1}}
1 голос
/ 16 октября 2019

Составьте список словарей, разбирающих каждый символ. Можно также разобрать каждую строку.

Существует большая вероятность найти пользовательскую библиотеку, которая уже выполняет эту функцию, но есть способ сделать это

import json

braces = []
dicts = []
dict_chars = []

for line in inp: # input is a builtin so renamed from input to inp
  char = line.strip()
  dict_chars.append(line)
  if '{' == char:
    braces.append('}')
  elif '}' == char:
    braces.pop()
  elif len(braces) == 0 and dict_chars:
    text = ''.join(dict_chars)
    if text.strip():
      dicts.append(json.loads(text))
    dict_chars = []

Затем объединить словари в списке.

merged_dict = {}
for dct in dicts:
  merged_dict.update(dct)
> print(merged_dict)
{u'a': {u'x': u'y', u'w': u'z'}, u'b': {u'z': u'l', u'v': u'w'}}

Вывести объединенный словарь в виде строки json с отступом.

merged_output = json.dumps(merged_dict, indent=4)
...