How to parse json request in python?

Question:

I’m attempting to pull values out of a post request from slack inside of fast api. According to the slack API I should be receiving a json payload. The body I capture appears to be encoded and I’m unsure how to get it into json form.

What I have

async def get_body(request: Request):
    return await request.body()


@app.post("/slack", status_code=200)
async def recieveSlackInteraction(body = Depends(get_body)):
    decode = body.decode("utf-8")
    decode2 = urllib.parse.unquote(decode)
    with open("data_file.json", "w") as write_file:
        json.dump(decode2.strip('"'), write_file)

    
    return 

The above gives me this. How do I turn this into a json object I can access normally?

"payload={"type":"block_actions","user":{"id":"UKLSJDHFUMR","username":"user","name":"user","team_id":"TDFSDSSDJ"},"api_app_id":"A0SDFSDFDSFL2U","token":"SDFDSFSDFSDFYgk","container":{"type":"message","message_ts":"SDFSDFSDFDSF19","channel_id":"GSDFSDFSDFSDFPB","is_ephemeral":false},"trigger_id":"SDFSDFSDFDSFSDFSDFSDF","team":{"id":"SDFSDFSDFSDFSDF","domain":"SDFSDFSDF"},"enterprise":null,"is_enterprise_install":false,"channel":{"id":"SDFSDFSDF","name":"privategroup"},"message":{"type":"message","subtype":"bot_message","text":"This+content+can't+be+displayed.","ts":"SDFSDFSDF","bot_id":"SDFSDFSDFDSF","blocks":[{"type":"section","block_id":"bOsst","text":{"type":"mrkdwn","text":"<http:\/\/SDFSDF|SDFSDFSDF>","verbatim":false}},{"type":"actions","block_id":"sRgge","elements":[{"type":"button","action_id":"actionId-0","text":{"type":"plain_text","text":"Click+Me","emoji":true},"style":"danger","value":"REBOOT"}]}]},"state":{"values":{}},"response_url":"https:\/\/hooks.slack.com\/actions\/SDFSDF\/SDFSDFSDF\/SDFSDFSDFDSFDF","actions":[{"action_id":"actionId-0","block_id":"sRgge","text":{"type":"plain_text","text":"Click+Me","emoji":true},"value":"REBOOT","style":"danger","type":"button","action_ts":"1ASDASDASD"}]}"
Asked By: your average noob

||

Answers:

Regex would be a good way (which I will code up later). But basically you need to fix up the response into a valid json:

import json

jsonStr = '''"payload={"type":"block_actions","user":{"id":"UKLSJDHFUMR","username":"user","name":"user","team_id":"TDFSDSSDJ"},"api_app_id":"A0SDFSDFDSFL2U","token":"SDFDSFSDFSDFYgk","container":{"type":"message","message_ts":"SDFSDFSDFDSF19","channel_id":"GSDFSDFSDFSDFPB","is_ephemeral":false},"trigger_id":"SDFSDFSDFDSFSDFSDFSDF","team":{"id":"SDFSDFSDFSDFSDF","domain":"SDFSDFSDF"},"enterprise":null,"is_enterprise_install":false,"channel":{"id":"SDFSDFSDF","name":"privategroup"},"message":{"type":"message","subtype":"bot_message","text":"This+content+can't+be+displayed.","ts":"SDFSDFSDF","bot_id":"SDFSDFSDFDSF","blocks":[{"type":"section","block_id":"bOsst","text":{"type":"mrkdwn","text":"<http:\/\/SDFSDF|SDFSDFSDF>","verbatim":false}},{"type":"actions","block_id":"sRgge","elements":[{"type":"button","action_id":"actionId-0","text":{"type":"plain_text","text":"Click+Me","emoji":true},"style":"danger","value":"REBOOT"}]}]},"state":{"values":{}},"response_url":"https:\/\/hooks.slack.com\/actions\/SDFSDF\/SDFSDFSDF\/SDFSDFSDFDSFDF","actions":[{"action_id":"actionId-0","block_id":"sRgge","text":{"type":"plain_text","text":"Click+Me","emoji":true},"value":"REBOOT","style":"danger","type":"button","action_ts":"1ASDASDASD"}]}"'''
jsonStr = jsonStr.split('"payload=')[-1].replace('"','"').rsplit('"', 1)[0]

jsonData = json.loads(jsonStr)

Using Regex:

import re
import json

jsonStr = '''"payload={"type":"block_actions","user":{"id":"UKLSJDHFUMR","username":"user","name":"user","team_id":"TDFSDSSDJ"},"api_app_id":"A0SDFSDFDSFL2U","token":"SDFDSFSDFSDFYgk","container":{"type":"message","message_ts":"SDFSDFSDFDSF19","channel_id":"GSDFSDFSDFSDFPB","is_ephemeral":false},"trigger_id":"SDFSDFSDFDSFSDFSDFSDF","team":{"id":"SDFSDFSDFSDFSDF","domain":"SDFSDFSDF"},"enterprise":null,"is_enterprise_install":false,"channel":{"id":"SDFSDFSDF","name":"privategroup"},"message":{"type":"message","subtype":"bot_message","text":"This+content+can't+be+displayed.","ts":"SDFSDFSDF","bot_id":"SDFSDFSDFDSF","blocks":[{"type":"section","block_id":"bOsst","text":{"type":"mrkdwn","text":"<http:\/\/SDFSDF|SDFSDFSDF>","verbatim":false}},{"type":"actions","block_id":"sRgge","elements":[{"type":"button","action_id":"actionId-0","text":{"type":"plain_text","text":"Click+Me","emoji":true},"style":"danger","value":"REBOOT"}]}]},"state":{"values":{}},"response_url":"https:\/\/hooks.slack.com\/actions\/SDFSDF\/SDFSDFSDF\/SDFSDFSDFDSFDF","actions":[{"action_id":"actionId-0","block_id":"sRgge","text":{"type":"plain_text","text":"Click+Me","emoji":true},"value":"REBOOT","style":"danger","type":"button","action_ts":"1ASDASDASD"}]}"'''


jsonStr = re.match('"payload=({.*})', jsonStr).group(1)
jsonData = json.loads(jsonStr)
Answered By: chitown88
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.