<blockquote>
<p>Now I want to strip off all he whitespaces and newlines for every value in the JSON file</p>
</blockquote>
<p>使用<code>pkgutil.simplegeneric()</code>创建助手函数<code>get_items()</code>:</p>
<pre><code>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)
</code></pre>
<p>注意:<a href="http://docs.python.org/3.4/library/functools#functools.singledispatch" rel="nofollow noreferrer">^{<cd3>}</a>函数(Python 3.4+)允许在这里使用<code>collections</code>'<a href="http://docs.python.org/3/library/collections.abc.html#collections-abstract-base-classes" rel="nofollow noreferrer">^{<cd5>}</a>,而不是<code>dict/list</code>。</p>
<h3><a href="http://ideone.com/Vfc6UW" rel="nofollow noreferrer">Output</a></h3>
<pre><code>{
"anotherName": [
{
"anArray": [
{
"anotherKey": "value",
"key": "value"
},
{
"anotherKey": "value",
"key": "value"
}
]
}
],
"name": [
{
"someKey": "some Value"
},
{
"someKey": "another value"
}
]
}
</code></pre>