web-dev-qa-db-fra.com

Conversion de JSON en JSON délimité par des sauts de ligne en Python

Mon objectif est de convertir le fichier JSON dans un format qui peut être téléchargé depuis Cloud Storage vers BigQuery ( comme décrit ici ) avec Python.

J'ai essayé d'utiliser newlineJSON package pour la conversion, mais je reçois l'erreur suivante.

JSONDecodeError: Expecting value or ']': line 2 column 1 (char 5)

Quelqu'un at-il la solution à cela?

Voici l'exemple de code JSON:

[{
    "key01": "value01",
    "key02": "value02",
    ...
    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",
    ...
    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",
    ...
    "keyN": "valueN"
}
]

Et voici le script python existant:

with nlj.open(url_samplejson, json_lib = "simplejson") as src_:
    with nlj.open(url_convertedjson, "w") as dst_:
        for line_ in src_:
            dst_.write(line_)
7
Fxs7576

La réponse avec jq est vraiment utile, mais si vous voulez toujours le faire avec Python (comme il semble d'après la question), vous pouvez le faire avec _ json module.

import json
from io import StringIO
in_json = StringIO("""[{
    "key01": "value01",
    "key02": "value02",

    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",

    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",

    "keyN": "valueN"
}
]""")

result = [json.dumps(record) for record in json.load(in_json)]  # the only significant line to convert the JSON to the desired format

print('\n'.join(result))

{"key01": "value01", "key02": "value02", "keyN": "valueN"}
{"key01": "value01", "key02": "value02", "keyN": "valueN"}
{"key01": "value01", "key02": "value02", "keyN": "valueN"}

* J'utilise StringIO et print ici juste pour rendre un échantillon plus facile à tester localement.

Comme alternative, vous pouvez utiliser liaison Python jq pour le combiner avec l'autre réponse .

10
Oleh Rybalchenko

Si vous êtes prêt à sortir de Python, utilisez jq:

$ cat a.json 
[{
    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
},
{
    "key01": "value01",
    "key02": "value02",
    "keyN": "valueN"
}
]


$ cat a.json | jq -c '.[]'
{"key01":"value01","key02":"value02","keyN":"valueN"}
{"key01":"value01","key02":"value02","keyN":"valueN"}
{"key01":"value01","key02":"value02","keyN":"valueN"}

L'itérateur que j'ai utilisé est '.[]' pour parcourir le tableau et -c place chaque objet JSON sur une seule ligne.

Ressources:

8
Felipe Hoffa

Cela prend un fichier JSON et convertit en fichier ND-JSON.

import json

with open("results-20190312-113458.json", "r") as read_file:
    data = json.load(read_file)
result = [json.dumps(record) for record in data]
with open('nd-proceesed.json', 'w') as obj:
    for i in result:
        obj.write(i+'\n')

J'espère que cela aide quelqu'un.

1
Saurav Joshi