Home > Software design >  Python - how to convert a json.loads variable to list and append
Python - how to convert a json.loads variable to list and append

Time:06-08

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_)
  • Related