I have a JSON
file that has the following structure:
{
"name":[
{
"someKey": "\n\n some Value "
},
{
"someKey": "another value "
}
],
"anotherName":[
{
"anArray": [
{
"key": " value\n\n",
"anotherKey": " value"
},
{
"key": " value\n",
"anotherKey": "value"
}
]
}
]
}
Now I want to strip
off all he whitespaces and newlines for every value in the JSON
file. Is there some way to iterate over each element of the dictionary and the nested dictionaries and lists?
Now I want to strip off all he whitespaces and newlines for every value in the JSON file
Using pkgutil.simplegeneric()
to create a helper function get_items()
:
import json
import sys
from pkgutil import simplegeneric
@simplegeneric
def get_items(obj):
while False: # no items, a scalar object
yield None
@get_items.register(dict)
def _(obj):
return obj.items() # json object. Edit: iteritems() was removed in Python 3
@get_items.register(list)
def _(obj):
return enumerate(obj) # json array
def strip_whitespace(json_data):
for key, value in get_items(json_data):
if hasattr(value, 'strip'): # json string
json_data[key] = value.strip()
else:
strip_whitespace(value) # recursive call
data = json.load(sys.stdin) # read json data from standard input
strip_whitespace(data)
json.dump(data, sys.stdout, indent=2)
Note: functools.singledispatch()
function (Python 3.4+) would allow to use collections
' MutableMapping/MutableSequence
instead of dict/list
here.
Output
{
"anotherName": [
{
"anArray": [
{
"anotherKey": "value",
"key": "value"
},
{
"anotherKey": "value",
"key": "value"
}
]
}
],
"name": [
{
"someKey": "some Value"
},
{
"someKey": "another value"
}
]
}
Parse the file using JSON:
import json
file = file.replace('\n', '') # do your cleanup here
data = json.loads(file)
then walk through the resulting data structure.
This may not be the most efficient process, but it works. I copied that sample into a file named json.txt
, then read it, deserialized it with json.loads()
, and used a pair of functions to recursively clean it and everything inside it.
import json
def clean_dict(d):
for key, value in d.iteritems():
if isinstance(value, list):
clean_list(value)
elif isinstance(value, dict):
clean_dict(value)
else:
newvalue = value.strip()
d[key] = newvalue
def clean_list(l):
for index, item in enumerate(l):
if isinstance(item, dict):
clean_dict(item)
elif isinstance(item, list):
clean_list(item)
else:
l[index] = item.strip()
# Read the file and send it to the dict cleaner
with open("json.txt") as f:
data = json.load(f)
print "before..."
print data, "\n"
clean_dict(data)
print "after..."
print data
The result...
before...
{u'anotherName': [{u'anArray': [{u'anotherKey': u' value', u'key': u' value\n\n'}, {u'anotherKey': u'value', u'key': u' value\n'}]}], u'name': [{u'someKey': u'\n\n some Value '}, {u'someKey': u'another value '}]}
after...
{u'anotherName': [{u'anArray': [{u'anotherKey': u'value', u'key': u'value'}, {u'anotherKey': u'value', u'key': u'value'}]}], u'name': [{u'someKey': u'some Value'}, {u'someKey': u'another value'}]}
来源:https://stackoverflow.com/questions/17098553/how-to-remove-whitespaces-and-newlines-from-every-value-in-a-json-file