次の構造のJSON
ファイルがあります。
{
"name":[
{
"someKey": "\n\n some Value "
},
{
"someKey": "another value "
}
],
"anotherName":[
{
"anArray": [
{
"key": " value\n\n",
"anotherKey": " value"
},
{
"key": " value\n",
"anotherKey": "value"
}
]
}
]
}
ここで、strip
ファイル内のすべての値のすべての空白と改行をJSON
オフにします。ディクショナリの各要素とネストされたディクショナリおよびリストを反復処理する方法はありますか?
次に、JSONファイルのすべての値の空白と改行をすべて削除します
pkgutil.simplegeneric()
を使用してヘルパー関数を作成する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)
注: functools.singledispatch()
関数(Python 3.4+)では、ここでMutableMapping/MutableSequence
の代わりにcollections
' dict/list
を使用できます。
{
"anotherName": [
{
"anArray": [
{
"anotherKey": "value",
"key": "value"
},
{
"anotherKey": "value",
"key": "value"
}
]
}
],
"name": [
{
"someKey": "some Value"
},
{
"someKey": "another value"
}
]
}
[〜#〜] json [〜#〜] を使用してファイルを解析します:
import json
file = file.replace('\n', '') # do your cleanup here
data = json.loads(file)
次に、結果のデータ構造をウォークスルーします。
これは最も効率的なプロセスではないかもしれませんが、機能します。そのサンプルを_json.txt
_という名前のファイルにコピーしてから読み取り、json.loads()
で逆シリアル化し、関数のペアを使用してサンプルとその中のすべてを再帰的にクリーンアップしました。
_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
_
結果...
_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'}]}
_