web-dev-qa-db-ja.com

JSONファイルのすべての値から空白と改行を削除するにはどうすればよいですか?

次の構造の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オフにします。ディクショナリの各要素とネストされたディクショナリおよびリストを反復処理する方法はありますか?

14
John West

次に、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"
    }
  ]
}
8
jfs

[〜#〜] json [〜#〜] を使用してファイルを解析します:

import json
file = file.replace('\n', '')    # do your cleanup here
data = json.loads(file)

次に、結果のデータ構造をウォークスルーします。

2
Brent Washburne

これは最も効率的なプロセスではないかもしれませんが、機能します。そのサンプルを_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'}]}
_
1