Python format json output - python

I have output from json as below from curl:
{'TableViewConfig': {'displayLength': 50, 'Resources': ...}}
it needs to be passed in another curl get command with data but in below format:
{\"TableViewConfig\":{\"displayLength\":50,\"Resources\":...}}
Can you please help in resolving the str replace in python dict?
Tried below, but it didnt work:
request = 'url'
response = requests.get(request)
data = json.loads(response)
print(data)
orig = list(map(lambda item: dict((k.replace(''', ''\'), v.replace(''', ''\')) for k, v in item.items()), data))

Related

How to filter out data from a print out message

I have this one problem, where I print out a message response from a website(JSON response), and the response I get is this.
Here is my model with fake data:
{"token": "MTAxOTAwNjM4NjEyMzg0OTkwMQ.8hkyLV.n0ir2UA4qFE5pXen9YnPtFzgn4xP8tHmVmmkrl", "user_settings": {"locale": "en-US", "theme": "dark"}, "user_id": "101900638614857883"}
And, if I only want the value of "token" data which are this (MTAxOTAwNjM4NjEyMzg0OTkwMQ.8hkyLV.n0ir2UA4qFE5pXen9YnPtFzgn4xP8tHmVmmkrl) and I want to store it into a txt file, is there any good way to do it?
Thank you, guys!
I tried print(r.text('token')) but it did not work, since it only works on printing the category of the data's (like : Category : {"token" : 'daefafa', "user-id" : 'er121231231', more})
In python, JSON is treated as a dictionary.
To filter it use dictionary comprehension
tokenData = {key: val for key,val in data_json.items() if key == 'token'}
Full Code Snippet :
from urllib.request import urlopen
import json
url = "enter-your-url"
response = urlopen(url)
data_json = json.loads(response.read())
print(type(data_json)) # <class 'dict'>
#use dict comprehension
jsonToken = {key: val for key,val in data_json.items() if key == 'result'}
strToken = json.dumps(jsonToken)
# Only string json can be written to files
with open('data.txt','w') as file:
file.write(strToken)
file.close()
You need to parse the JSON into a dictionary using json.loads(). Like this:
import json
# ...
# request-getting code
# ...
data = json.loads(r.text)
print(data['token'])

how to get a data from another data in python json

This is the response I get from the server:
[{"status": "OK", "data":[{"Number":"9358925074","Name":"mark","Family":"tomson"}]}]
and if I want to get the Name value from the response, what can I do? can someone make a example in python?
You can do this.
>>> data = [{"status": "OK", "data":[{"Number":"9358925074","Name":"mark","Family":"tomson"}]}]
>>> data[0]['data'][0]['Name']
'mark'
output:
'mark'
This worked for me:
data = json.loads(j.content.decode())
for d in data:
pass
name = (d['data'][0]['Number'])
print(name)
output:
9358925074

Reading JSon return values from an API

I'm getting below output from an API and I want to read all purchaseOrder data. Not really sure how to loop on this data. Also it comes with b' at the front.
b'[
{"purchaseOrder":
[
{
"id":"d01f0f6d-398f-4220-8a9a-44f47beedf04",
"installationNumber":null,
"peerId":"308866ba-90cb-47a7-8c73-589c0f355eb7",
"validFrom":"2019-06-07T12:51:15.000+0000",
"validTo":"2019-06-07T13:51:15.000+0000",
"originalQuantity":5,
"quantity":5,
"price":5,
"periodInitial":"2019-06-07T13:00:00.000+0000",
"periodFinal":"2019-06-07T14:00:00.000+0000"
}
],
"salesOrder":null,
"agreement":null,
"status":""
}
]'
Have tried things like loaded_json = json.load(r.content) and it didn't work.
This is code I use to get the response:
r = requests.post(url=api_endpoint, data=json.dumps(json_post), headers=headers)
To get the json of a response use data = response.json().
After that you can step through it like normal lists and dicts:
import json
data = r.json()
print(json.dumps(data , indent=2)) # If you want to see the data from the response
for dic in data :
if 'purchaseOrder' in dic:
for item in dic['purchaseOrder']:
# item here is the `dict` for each purchaseOrder (PO).
print(json.dumps(item, indent=2)) # This will print each item in PO.
Thanks all for support. The next code works for me:
data = r.json()
print(json.dumps(data, indent=2))
for dic in data:
if 'purchaseOrder' in dic:
for itemdata in dic['purchaseOrder']:
for key in itemdata:
if key == 'id':
print("Id:")
print(itemdata['id'])
print("Price:")
print(itemdata['price'])

Backslash is added to JSON before double quote

As a json response I got it from server
{"Data":["{\"item1\": \"value1\",\"item2\": \"value2\"}"]}
I used
a=json.loads(response)
print(a)
self.write(a)
From terminal I saw
{u'Data':[u'{"item1": "value1", "item2": "value2"}"]'}
From postman it's like
{"Data":["{\"item1\": \"value1\",\"item2\": \"value2\"}"]}
I need as
{"Data":[{"item1": "value1","item2": "value2"}]}
I know all this format are right but I prefer the last format in postman. Thanks in advance
I tried the below and it works...
content = json.loads(content)['data']
temp = []
for values in content:
jstr = json.loads(values)
temp.append(jstr)
val = {"data": temp}
self.write(json.dumps(val))

Python request.post Not Accepting Dictionary

here is the data that I want to post,
this is the printed version of the dictionary answers:
{'Emails': set([u'vernon.fadel#denesik.com', u'helyn67#cruickshankmckenzie.com', u'tryan#fishercremin.com', u'cecilia.kerluke#gmail.com', u'sonia.ruecker#schmidt.info', u'reichel.tamatha#gmail.com', u'johntyree69#greendale.edu', u'gail34#reichel.com', u'birdman#quitzon.net ', u'onolan#gmail.com', u'lindgren.merry#howe.com', u'wilderman.nyree#heidenreich.com', u'yschneider#jacobson.biz', u'nakia.larkin#gmail.com', u'vblanda#gmail.com', u'pkoch#yahoo.com', u'ygoyette#yahoo.com', u'wiegand.lynnette#beer.com', u'ubradtke#hotmail.com', u'troy67#yahoo.com', u'eileen.gusikowski#oreilly.info', u'glubowitz#yahoo.com', u'inolan#hotmail.com', u'lfranecki#hotmail.com', u'miller.hana#gmail.com', u'morissette.lalla#kuhicmuller.com', u'harber.gisele#gmail.com', u'odalys.dubuque#ebertrunte.net', u'jones.kyree#auer.net', u'adams77#yahoo.com', u'parisian.linda#hotmail.com', u'channing.cremin#toy.org', u'chad.armstrong#yahoo.com', u'isaac.nolan#hotmail.com', u'kozey.luciana#collins.biz', u'cstehr#keebler.com', u'jquitzon#gmail.com', u'hhirthe#yahoo.com', u'emilia16#block.com', u'arice#greenholtconsidine.com', u'tobin.schuppe#gmail.com', u'wyman.junious#gmail.com', u'mrath#ruecker.com ', u' johns.sonji#lakinwalker.info', u'thiel.cassie#hodkiewicz.info', u'fjaskolski#hotmail.com', u'mosciski.destany#hotmail.com', u'vrippin#gmail.com', u'zschuppe#hotmail.com', u'clotilda26#goodwinlind.info', u'lizette.walker#stanton.com', u'hettinger.kamari#hotmail.com', u'emelia54#yahoo.com', u'terry.ezekiel#hotmail.com', u'douglyass.dickinson#hotmail.com', u'zulauf.olympia#gmail.com', u'maxxx.waters#sauer.biz', u'abshire.charmaine#schusterlabadie.com', u'kuvalis.dewitt#wolfschaefer.com', u"elberta.o'connell#yahoo.com", u'henery76#yahoo.com', u'britny60#gmail.com', u'ed.hilpert#hansen.com', u'burnice.feest#yahoo.com', u' ybartoletti#littel.biz', u'sharde.murazik#hotmail.com', u'angelica.klocko#ankunding', u'brandi.klein#hotmail.com', u'dollie49#hotmail.com', u'mrath#ruecker.com', u'hayley27#koelpin.com', u'georgiann.mertz#moen.net', u'floretta39#volkmanrosenbaum.net', u'vicy.predovic#gmail.com', u'raven53#yahoo.com', u'fmann#yahoo.com', u'sdaugherty#gmail.com', u'gerlach.villa#koelpinfeeney.net', u'alysha.gibson#hotmail.com', u'hoy.kozey#gmail.com', u'cheyenne84#lehneroconner.com', u'uoberbrunner#hotmail.com', u'hhaag#swaniawskiterry.info', u'infant80#yahoo.com', u'manilla.west#hotmail.com', u'hconsidine#bernhardhills.info', u'dean94#hotmail.com', u'bahringer.karl#yahoo.com', u'crona.meredith#gmail.com', u'letta.larkin#quitzon.net', u'owindler#strosin.info', u'shanahan.anders#yahoo.com', u'mclaughlin.desi#gmail.com', u'erdman.icy#hotmail.com', u'salvatore21#hintz.com', u'jkoch#hotmail.com', u'red.beatty#yahoo.com', u'helma91#hotmail.com', u'arland.koepp#hotmail.com', u'ymoore#cristhalvorson.org', u'woodie.crooks#kozey.com', None, u'jchamplin#hotmail.com ', u'walter.elwyn#yahoo.com']), '# of Emails per Domain': {u'#hotmail.com': 22, u'#yahoo.com': 18, u'#gmail.com': 18}, 'April Users': 70}
when I run:
r = requests.post('https://9g9xhayrh5.execute-api.us-west-2.amazonaws.com/test/data', data = answers)
I get this error:
{"message": "Could not parse request body into json: Unrecognized token \'Emails\': was expecting (\'true\', \'false\' or \'null\')\n at [Source: [B#311a7237; line: 1, column: 8]"}
Not sure what this means at all, I've tried to parse the data into json, why doesn't it like the 'Email' string?
If I add the json.dump code I get:
TypeError
TypeError: set([u'vernon.fadel#denesik.com', u'helyn67#cruickshankmckenzie.com', u'tryan#fishercremin.com', u'cecilia.kerluke#gmail.com', u'sonia.ruecker#schmidt.info', u'reichel.tamatha#gmail.com', u'johntyree69#greendale.edu', u'gail34#reichel.com', u'birdman#quitzon.net ', u'onolan#gmail.com', u'lindgren.merry#howe.com', u'wilderman.nyree#heidenreich.com', u'yschneider#jacobson.biz', u'nakia.larkin#gmail.com', u'vblanda#gmail.com', u'pkoch#yahoo.com', u'ygoyette#yahoo.com', u'wiegand.lynnette#beer.com', u'ubradtke#hotmail.com', u'troy67#yahoo.com', u'eileen.gusikowski#oreilly.info', u'glubowitz#yahoo.com', u'inolan#hotmail.com', u'lfranecki#hotmail.com', u'miller.hana#gmail.com', u'morissette.lalla#kuhicmuller.com', u'harber.gisele#gmail.com', u'odalys.dubuque#ebertrunte.net', u'jones.kyree#auer.net', u'adams77#yahoo.com', u'parisian.linda#hotmail.com', u'channing.cremin#toy.org', u'chad.armstrong#yahoo.com', u'isaac.nolan#hotmail.com', u'kozey.luciana#collins.biz', u'cstehr#keebler.com', u'jquitzon#gmail.com', u'hhirthe#yahoo.com', u'emilia16#block.com', u'arice#greenholtconsidine.com', u'tobin.schuppe#gmail.com', u'wyman.junious#gmail.com', u'mrath#ruecker.com ', u' johns.sonji#lakinwalker.info', u'thiel.cassie#hodkiewicz.info', u'fjaskolski#hotmail.com', u'mosciski.destany#hotmail.com', u'vrippin#gmail.com', u'zschuppe#hotmail.com', u'clotilda26#goodwinlind.info', u'lizette.walker#stanton.com', u'hettinger.kamari#hotmail.com', u'emelia54#yahoo.com', u'terry.ezekiel#hotmail.com', u'douglyass.dickinson#hotmail.com', u'zulauf.olympia#gmail.com', u'maxxx.waters#sauer.biz', u'abshire.charmaine#schusterlabadie.com', u'kuvalis.dewitt#wolfschaefer.com', u"elberta.o'connell#yahoo.com", u'henery76#yahoo.com', u'britny60#gmail.com', u'ed.hilpert#hansen.com', u'burnice.feest#yahoo.com', u' ybartoletti#littel.biz', u'sharde.murazik#hotmail.com', u'angelica.klocko#ankunding', u'brandi.klein#hotmail.com', u'dollie49#hotmail.com', u'mrath#ruecker.com', u'hayley27#koelpin.com', u'georgiann.mertz#moen.net', u'floretta39#volkmanrosenbaum.net', u'vicy.predovic#gmail.com', u'raven53#yahoo.com', u'fmann#yahoo.com', u'sdaugherty#gmail.com', u'gerlach.villa#koelpinfeeney.net', u'alysha.gibson#hotmail.com', u'hoy.kozey#gmail.com', u'cheyenne84#lehneroconner.com', u'uoberbrunner#hotmail.com', u'hhaag#swaniawskiterry.info', u'infant80#yahoo.com', u'manilla.west#hotmail.com', u'hconsidine#bernhardhills.info', u'dean94#hotmail.com', u'bahringer.karl#yahoo.com', u'crona.meredith#gmail.com', u'letta.larkin#quitzon.net', u'owindler#strosin.info', u'shanahan.anders#yahoo.com', u'mclaughlin.desi#gmail.com', u'erdman.icy#hotmail.com', u'salvatore21#hintz.com', u'jkoch#hotmail.com', u'red.beatty#yahoo.com', u'helma91#hotmail.com', u'arland.koepp#hotmail.com', u'ymoore#cristhalvorson.org', u'woodie.crooks#kozey.com', None, u'jchamplin#hotmail.com ', u'walter.elwyn#yahoo.com']) is not JSON serializable
This works:
import requests
import json
answers = {} #...
url = "..."
answers['Emails'] = list(answers['Emails'])
r = requests.post(url, data=json.dumps(answers))
The reason the other way doesn't work is that by default requests sends data with the Content-Type application/x-www-form-urlencoded instead of JSON.
To change that, you can also use json instead of the data parameter:
r = requests.post(url, json=answers)
To debug code using the requests library, you can look at a prepared request before sending it.
TypeError: set([ ... ]) is not JSON serializable
Sets are not JSON serializable. You can either convert all of the sets to lists in the dictionary:
answers = {key: list(value) if isinstance(value, set) else value
for key, value in answers.items()}
(Note that this would not work for nested dictionaries as is).
Or, use a custom JSON encoder that would handle the set serialization.
Dumping and loading it back with json usually helps in debugging:
import json
answers = json.loads(json.dumps(answers))
r = requests.post('https://9g9xhayrh5.execute-api.us-west-2.amazonaws.com/test/data', data=answers)

Categories