2 votes

Python/PySpark parse une chaîne JSON avec des attributs numérotés

J'ai besoin de stocker des chaînes JSON comme celle ci-dessous dans un format de fichier différent du texte en clair (par exemple : parquet) :

{
  "vidName": "Foo",
  "vidInfo.0.size.length": 10,
  "vidInfo.0.size.width": 10,
  "vidInfo.0.quality": "Good",
  "vidInfo.1.size.length": 7,
  "vidInfo.1.size.width": 3,
  "vidInfo.1.quality": "Bad",
  "vidInfo.2.size.length": 10,
  "vidInfo.2.size.width": 2,
  "vidInfo.2.quality": "Excelent"
}

Il n'y a pas de limite connue pour l'index de vidInfo (peut être 10, 20). Ainsi, je veux soit avoir les vidInfos dans un tableau, soit exploser un tel objet JSON en plusieurs objets plus petits.

J'ai trouvé cette question : Parsing PHP JSON (attributs de nombre ?) Mais c'est en PHP, ce que je ne comprends pas bien. Et je ne suis pas sûr que cela corresponde à ce dont j'ai besoin.

Les données intermédiaires devraient ressembler à ceci :

{
  "vidName": "Foo",
  "vidInfo": [
    {
      "id": 0,
      "size": {
        "length": 10,
        "width": 10
      },
      "quality": "Good"
    },
    {
      "id": 1,
      "size": {
        "length": 7,
        "width": 3
      },
      "quality": "Bad"
    },
    {
      "id": 2,
      "size": {
        "length": 10,
        "width": 2
      },
      "quality": "Excelent"
    }
  ]
}

ou comme ça :

{
  "vidName": "Foo",
  "vidInfo": [
    {
      "size": {
        "length": 10,
        "width": 10
      },
      "quality": "Good"
    },
    {
      "size": {
        "length": 7,
        "width": 3
      },
      "quality": "Bad"
    },
    {
      "size": {
        "length": 10,
        "width": 2
      },
      "quality": "Excelent"
    }
  ]
}

Je suis coincé, et j'aurais besoin de quelques conseils pour avancer. Pourriez-vous m'aider ? Merci beaucoup pour votre aide.

1voto

Averell Points 81

J'ai trouvé cette bibliothèque https://github.com/amirziai/flatten qui fait l'affaire.

In [154]: some_json = {
 ...:   "vidName": "Foo",
 ...:   "vidInfo.0.size.length": 10,
 ...:   "vidInfo.0.size.width": 10,
 ...:   "vidInfo.0.quality": "Good",
 ...:   "vidInfo.1.size.length": 7,
 ...:   "vidInfo.1.size.width": 3,
 ...:   "vidInfo.1.quality": "Bad",
 ...:   "vidInfo.2.size.length": 10,
 ...:   "vidInfo.2.size.width": 2,
 ...:   "vidInfo.2.quality": "Excelent"
 ...: }

In [155]: some_json
Out[155]:
{'vidName': 'Foo',
 'vidInfo.0.size.length': 10,
 'vidInfo.0.size.width': 10,
 'vidInfo.0.quality': 'Good',
 'vidInfo.1.size.length': 7,
 'vidInfo.1.size.width': 3,
 'vidInfo.1.quality': 'Bad',
 'vidInfo.2.size.length': 10,
 'vidInfo.2.size.width': 2,
 'vidInfo.2.quality': 'Excelent'}

In [156]: from flatten_json import unflatten_list
     ...: import json 
     ...: nested_json = unflatten_list(json.loads(json.dumps(some_json)), '.')

In [157]: nested_json
Out[157]:
{'vidInfo': [{'quality': 'Good', 'size': {'length': 10, 'width': 10}},
  {'quality': 'Bad', 'size': {'length': 7, 'width': 3}},
  {'quality': 'Excelent', 'size': {'length': 10, 'width': 2}}],
 'vidName': 'Foo'}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X