I have a JSON file that needs to be sent. Before sending I need to do a validity check and replace some special characters (spaces and dots(.
)).
The problem is that Python inserts u
character before each of my strings, which can't be read by the server. How do I remove the u
character and do the data sanitation (character replacement)?
Original JSON
{
"columns": [
{
"data": "Doc.",
"title": "Doc."
},
{
"data": "Order no.",
"title": "Order no."
},
{
"data": "Nothing",
"title": "Nothing"
}
],
"data": [
{
"Doc.": "564251422",
"Nothing": 0.0,
"Order no.": "56421"
},
{
"Doc.": "546546545",
"Nothing": 0.0,
"Order no.": "98745"
}
]
}
Python:
import json
def func():
with open('json/simpledata.json', 'r') as json_file:
json_data = json.load(json_file)
print(json_data)
func()
Output JSON:
{u'data': [{u'Nothing': 0.0, u'Order no.': u'56421', u'Doc.': u'564251422'}, {u'Nothing': 0.0, u'Order no.': u'98745', u'Doc.': u'546546545'}], u'columns': [{u'data': u'Doc.', u'title': u'Doc.'}, {u'data': u'Order no.', u'title': u'Order no.'}, {u'data': u'Nothing', u'title': u'Nothing'}]}
What I'm trying to achieve in Python:
sanitizeData: function(jsonArray) {
var newKey;
jsonArray.forEach(function(item) {
for (key in item) {
newKey = key.replace(/\s/g, '').replace(/\./g, '');
if (key != newKey) {
item[newKey] = item[key];
delete item[key];
}
}
})
return jsonArray;
},
# remove whitespace and dots from data : <propName> references
sanitizeColumns: function(jsonArray) {
var dataProp = [];
jsonArray.forEach(function(item) {
dataProp = item['data'].replace(/\s/g, '').replace(/\./g, '');
item['data'] = dataProp;
})
return jsonArray;
}
To properly print the JSON as a string, try
print(json.dumps(json_data))
See also https://docs.python.org/2/library/json.html#json.dumps
For removing certain characters from a string you can do the obvious thing:
or, more efficiently, use str.translate (the example only works for python 2):
or with regular expressions; re.sub:
And then just use a nice comprehension to go over the whole dictionary (use
items()
with python 3):But this only works on a swallow dictionary. It doesn't look like your solution works on a deeply nested structure as well though. But if you need that, how about some recursion (for python 3 use
items()
instead ofiteritems()
andstr
instead ofbasestring
):I just wanted to add a version to the excellent solution af @Felk. I had a bunch of keys that had dots in them. The solution from @Felk removed the dots from the keys, but also from the values - which I did not want. So for anyone - like me - entering this post for a solution that only sanitites the keys, here it is.
example: