Basically I need to get the json content of a file, replace a variable and then append it with a new dictionary. I've tried in every way and searched but I can't find a solution. *The first line exemplifies the data that comes from the .json file
liststr = [{"type": "divider"},{"type": "section","text": {"type": "mrkdwn","text": "Olá {user} :wave:\n\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \n\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D 30. "}}]
liststr = str(liststr)
liststr = liststr.replace("{user}", "Bruno")
listlist = json.loads(json.dumps(liststr))
print(listlist)
Even that part works fine. The issue is that as I said, I need to append with one more information, for example:
liststr = [{"type": "divider"},{"type": "section","text": {"type": "mrkdwn","text": "Olá {user} :wave:\n\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \n\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D 30. "}}]
liststr = str(liststr)
liststr = liststr.replace("{user}", "Bruno")
listlist = json.loads(json.dumps(liststr))
listlist.append({
"user": "bruno"
})
print(listlist)
I get the error message
"AttributeError: 'str' object has no attribute 'append'"
because it considers the json.loads variable to be str instead of list. I've tried converting it to a list but it doesn't work either.
CodePudding user response:
def replace(v, needle, replacement):
if isinstance(v, str):
return v.replace(needle, replacement)
if isinstance(v, list):
return [replace(i, needle, replacement) for i in v]
if isinstance(v, dict):
return {k: replace(i, needle, replacement) for k, i in v.items()}
return v
l = [{"type": "divider"},{"type": "section","text": {"type": "mrkdwn","text": "Olá {user} :wave:\n\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \n\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D 30. "}}]
l = replace(l, '{user}', 'buno')
This is what you're trying to do. Recursively iterate over all values in the list of dicts, and replace the string "{user}" in any of them, all the while keeping everything as a list of dicts and not turning everything into a string.
CodePudding user response:
Not certain what the logic is here so making an assumption that any dictionary with a key of 'text' whose value is a string may need modification. If that is the case then:
list_ = [{"type": "divider"},{"type": "section","text": {"type": "mrkdwn","text": "Olá {user} :wave:\n\n Segue abaixo a listagem de colaboradores terceiro sob sua gestão e a data de expiração da conta. \n\nA data de expiração máxima para a conta é de 30 dias. Caso o período de renovação exceda esse limite, a data será fixada em D 30. "}}]
def process(d):
for k, v in d.items():
if isinstance(v, dict):
process(v)
else:
if isinstance(v, str) and k == 'text':
d['text'] = v.replace('{user}', 'Bruno')
break
for d in list_:
process(d)
print(list_)