2017-04-04 1 views
1

Ceci est probablement une question de débutant.Fonction pour lire les données json et un chemin json pour renvoyer un uplet ou une liste

Mais j'essaye de créer une fonction (ou de trouver une bibliothèque qui en a une) pour retourner un tuple ou une liste quand je passe une donnée json et jsonPath à elle; quelque chose comme ceci:

Tup1 = Extract(json_data,json_path) 
List1 = Extract(json_data,json_path) 

tournant ainsi fondamentalement quelque chose comme ceci:

{ 
    "name"="john", 
    "age"=25 
} 

à

Tup1 = ('john',25) 

OU

List1 = ['john',25] 

Est-il possible d'y arriver avec un minimum codage?

+0

Quel est le chemin JSON pour? Allez-vous le sauvegarder plus tard? – abccd

+0

Et la même fonction ne renverrait pas deux types différents juste parce que vous changiez le nom de la variable. – abccd

+0

@abccd répond: 1- Je crée la chaîne json_path d'après ce que je sais du schéma de json_data, que je peux modifier plus tard le schéma changements 2- Je n'ai pas besoin de retourner les deux types, l'un d'entre eux fonctionne pour moi – Zac

Répondre

0

jsonpath est une petite bibliothèque que j'utilisé pour extraire un élément en utilisant son adresse jsonpath et créer une fonction qui obtient des données de JSON et une liste d'éléments de jsonpath et renvoie les valeurs correspondantes pour chaque élément de données JSON en tant que tuple:

Évidemment, vous pouvez étendre cette fonction de vos propres exigences

from jsonpath import jsonpath 

def json2tuple(json_data,jsonpaths_list): 
    return_data = [] 

    for path in jsonpaths_list : 
     return_data.append(jsonpath(json_data,path)[0]) 

    return(tuple(return_data)) 
1

Ce que vous pouvez faire est que vous pouvez utiliser une compréhension simple liste pour joindre toutes les valeurs dans une liste à partir des données json après avoir été analysé. Pour gérer l'analyse, utilisez simplement json.load pour charger un fichier ou json.loads pour charger à partir d'une chaîne.

Ce sera de retour comme une liste:

import json 
def Extract(json_data,json_path): 
    json_data = json.load(json_path) # parse the data from json_path, if it's already parsed, skip this line 
    return [val for val in json_data.values()] # add tuple() around it if you want tuple instead 

List1 = Extract(json_data,json_path) 
+0

Je vais essayer, merci l'homme – Zac

1

{ "name"="john", "age"=25 }

n'est pas une syntaxe correcte pour un ensemble de données JSON, vous devez remplacer = avec :

{ "name":"john", "age":25 }

One des façons de faire est:

import json 

#assuming json_data contains valid data 
def Extract(json_data, json_path, format="list"): 
    try: 
     data = json.loads(json_data) 
     if format == "list": 
      reutrn data.values() 
     elif format == "tuple": 
      reutrn tuple(data.values()) 
    except ValueError as e: 
     print "error in parsing json_data", e 

#assuming json_path contains valid data  
def Extract(json_data, json_path, format="list"): 
    try: 
     data = json.load(json_path) 
     if format == "list": 
      reutrn data.values() 
     elif format == "tuple": 
      reutrn tuple(data.values()) 
    except ValueError as e: 
     print "error in parsing json_data", e  
    except IOError as e: 
     print "error in opening json_path", e 
paquet