Προς το περιεχόμενο

Βοηθεια με json αρχειο


thiva7

Προτεινόμενες αναρτήσεις

Καλησπερα ,  εχω ενα json αρχειο το οποιο παιρνω με python με τον εξής τροπο

def data():
    url = "http://domain.com/response.json"
   
    req = urllib.request.Request(url)

    ##parsing response
    r = urllib.request.urlopen(req).read()
    data_json = json.loads(r)

    return data_json

Τα προβλαματα ξεκινούν απο δω και περα , 

Θελω να συνδιασω την μια τιμη του αρχειου με το αλλο

το δεμο json ειναι αυτο

{
  "names": [
    {
      
      "id1": "12345",   // 0 - 0
      "id2": "6789",    // 0 - 1     
      "name": "Onoma 1 ",
      "last": "Epitheto 1 ",
      
    },
    {

      "id1": "New123455", // 1 -2
      "id2": "New6789", // 1 - 3   
      "name": "Onoma 2",
      "last": "Onoma 2"

    },
    
  ],

  "another": [
    {
      "name": "Onoma 1",
      "id": "12345"

    },
    {
      "name": "Onoma 1",
      "id": "6789"
    },
    {
      "name": "Onoma 2",
      "id": "New123455"

    },
    {
      "name": "Onoma 2",
      "id": "New6789"

    },
    
  ],
  
}

 

θελω την τιμη ID απο το

"another": [ ...// "id":

να το συγκρινο με το id1 η id2 απο το

"names": [

και οποιο id1 η id2 ταιριαζει με το id απο το "another": [ ...// "id": να δειχνω εκεινα τα στοιχεια.

οταν κανω το

for i in range(len(data()['onoma'])):
	print(i)

γυρναει 0 και 1 ( δυο στοιχεια οκ κομπλε)

αλλα για το

for i in range(len(data()['another'])):
	print(i)

γυρναει 0 ,1 ,2 ,3 ( εχει 4 στοιχεια )

 

και σε οποιο συνδιασμο και εαν προσπαθησα βγαζει out of range για το "onoma"

 

Καποια λυση ρε παιδια?

 

Ευχαριστω

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Ασχετος με python αλλα μηπως πρεπει πρωτα να ξεκινησεις με το μεγαλο array και μετα το μικρο; Καποιο απο τα δυο πρεπει να ειναι το source of truth

 

σε περιπτωση που λεω μαλακιες μηπως με intersection εκανες τη δουλεια σου; Πχ https://stackoverflow.com/questions/32391856/python-getting-the-intersection-of-two-json-files

σε περιπτωση που λεω παλι μαλακιες αγνοησε με. 😂

Επεξ/σία από Predatorkill
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

To json που βγαίνει είναι περιέργο ή κάτι έχεις γράψει λάθος. Στο names έχει id sto another exei id1 kai id2 κάτι δεν πάει καλά

Γενικά στην python τρέχεις τα iteratives με for item in items και όχι με for i in range και για να πάρεις αποτελέσματα στο συγκεκριμένο πρέπει να κάνεις κάτι περίεργα μαγικά όπως στον κώδικα παρακάτω:

data={
  "names": [
    {
      
      "id1": "12345",  
      "id2": "6789",   
      "name": "Onoma 1 ",
      "last": "Epitheto 1 ",
      
    },
    {

      "id1": "New123455",
      "id2": "New6789", 
      "name": "Onoma 2",
      "last": "Onoma 2"

    },
    
  ],

  "another": [
    {
      "name": "Onoma 1",
      "id": "12345"

    },
    {
      "name": "Onoma 1",
      "id": "6789"
    },
    {
      "name": "Onoma 2",
      "id": "New123455"

    },
    {
      "name": "Onoma 2",
      "id": "New6789"

    },
    
  ],
  
}

for item in data['another']:
    id = item['id']
    print("sto id "+id)
    for item2 in data['names']:
        #print (item2)
        for value in item2.values():
            if value == id:
                print ("antistoixei to onoma "+item2['name'])

 

Επεξ/σία από k33theod
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1 ώρα πριν, k33theod είπε

To json που βγαίνει είναι περιέργο ή κάτι έχεις γράψει λάθος. Στο names έχει id sto another exei id1 kai id2 κάτι δεν πάει καλά

Γενικά στην python τρέχεις τα iteratives με for item in items και όχι με for i in range και για να πάρεις αποτελέσματα στο συγκεκριμένο πρέπει να κάνεις κάτι περίεργα μαγικά όπως στον κώδικα παρακάτω:


data={
  "names": [
    {
      
      "id1": "12345",  
      "id2": "6789",   
      "name": "Onoma 1 ",
      "last": "Epitheto 1 ",
      
    },
    {

      "id1": "New123455",
      "id2": "New6789", 
      "name": "Onoma 2",
      "last": "Onoma 2"

    },
    
  ],

  "another": [
    {
      "name": "Onoma 1",
      "id": "12345"

    },
    {
      "name": "Onoma 1",
      "id": "6789"
    },
    {
      "name": "Onoma 2",
      "id": "New123455"

    },
    {
      "name": "Onoma 2",
      "id": "New6789"

    },
    
  ],
  
}

for item in data['another']:
    id = item['id']
    print("sto id "+id)
    for item2 in data['names']:
        #print (item2)
        for value in item2.values():
            if value == id:
                print ("antistoixei to onoma "+item2['name'])

 

Σε ευχαριστω για την απαντηση ,  το json ειναι ακριβως οπως στο γραφω η δομη του. στο κωδικα που μου εδωσες μου βγαζει αυτο

for item in data['another']:
TypeError: 'function' object is not subscriptable

 

Το json κανει το συγκεκριμενο κουλο ,

για καθε ενα ids στο names φτιαχνει αντιστοιχα ids και στο another,

δηλαδη με i οπως δοκιμαζα εγω επρεπε

0 - 0

0 - 1

1 - 2

1 - 3

2 - 4

2 - 5......με ποιο απλα λογια ρε συ στο names υπαρχει αυτο>??

"id1": "12345",   // 0 - 0
"id2": "6789",    // 0 - 1    

Θα φτιαξει αυτο στο another

{
      "name": "Onoma 1",
      "id": "12345"

    },
    {
      "name": "Onoma 1",
      "id": "6789"
    },
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Πάρε την έξοδο της function και ονόμασε την data1

data1 = data()#meta
for item in data1['another']:
    id = item['id']
    print("sto id "+id)
    for item2 in data1['names']:
        #print (item2)
        for value in item2.values():
            if value == id:
                print ("antistoixei to onoma "+item2['name'])

 

Επεξ/σία από k33theod
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Το πρόβλημα στο από πάνω είναι ότι θέλει

 data['another'].values()

 

Για να κάνεις αυτό που θες, χώρισε το dict σε δύο, στο names και στο another, ως

names = data['names']
another = data['another']

Μετά, για κάθε στοιχείο του another, πάρε το κλειδί id και σύγκρινε το με τα κλειδιά του names που αρχίζουν με id ως

for another_item in another.values():
    id = another_item['id']
    for names_item in names.values():
        for k, v in names_item.items():
            if k.startswith('id') and== id:
                print(f'Found match: {names_item} with {another_item}')


Τα αποτελέσματα μπορείς να τα αποθηκεύσεις σε μία μεταβλητή για να τα κάνεις ό,τι θέλεις μετά. 

Επεξ/σία από DrKo
fixed code formatting
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φίλε για να πάρεις μια απάντηση που να σε διευκολύνει στο πρόβλημά σου, θα πρέπει να εξηγήσεις με σαφήνεια το πρόβλημα.

Παραπάνω παραθέτεις ένα JSON με 2 arrays όπου το 2ο array (another) περιέχει την ίδια πληροφορία με το 1ο (names) σε περισσότερες εγγραφές.

Τι ακριβώς θέλεις να πετύχεις συγκρίνοντας τους 2 πίνακες;  Να βάλεις το πεδίο 'last' και στο another ; Αν όχι, γιατί δεν κρατάς μόνο τον πρώτο πίνακα;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 29/10/2021 στις 7:03 ΠΜ, k33theod είπε

Πάτε την έξοδο της function και ονόμασε την data1


data1 = data()#meta
for item in data1['another']:
    id = item['id']
    print("sto id "+id)
    for item2 in data1['names']:
        #print (item2)
        for value in item2.values():
            if value == id:
                print ("antistoixei to onoma "+item2['name'])

 

Αυτο δουλευει τελεια σε ευχαριστω πολυ

 

15 ώρες πριν, ralloss είπε

Φίλε για να πάρεις μια απάντηση που να σε διευκολύνει στο πρόβλημά σου, θα πρέπει να εξηγήσεις με σαφήνεια το πρόβλημα.

Παραπάνω παραθέτεις ένα JSON με 2 arrays όπου το 2ο array (another) περιέχει την ίδια πληροφορία με το 1ο (names) σε περισσότερες εγγραφές.

Τι ακριβώς θέλεις να πετύχεις συγκρίνοντας τους 2 πίνακες;  Να βάλεις το πεδίο 'last' και στο another ; Αν όχι, γιατί δεν κρατάς μόνο τον πρώτο πίνακα;

Αυτο που θελω φιλε μου να παιρνω στοιχεια απο τα ενα και με το αλλο και να βγαζω ενα μονο πινακα.

αυτο που εχω ανεβασει προφανώς ειναι ενα απλο αρχειο χωρις πολλα στοιχεια απλα για να καταλάβετε τι θελω ,  πχ στο πραγματικο αρχειο το name εχει ενα κατεβατο στοιχεια ,  και το another ΑΛΛΑ τοσο και χ2 κιολας

απλα το another ειχει ενα στοιχειο που το χρειαζομαι στο name.

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Πάλι δεν είναι τελείως ξεκάθαρο το τοπίο.

Υποθέτοντας λοιπόν, πως:
 - οι 2 εγγραφές στο another (που αντιστοιχούν σε 1 εγγραφή στο names) μπορεί να περιέχουν διαφορετικά πεδία μεταξύ τους,
 - αν τα ίδια keys που μπορεί να υπάρχουν στις 3 εγγραφές, δεν έχουν τα ίδια values μεταξύ τους,  τότε υπερισχύει η τιμή του names (αν υπάρχει και στα 3) , αλλιώς υπερισχύει το id1 στο another.

Με λίγα λόγα , όλα τα διαφορετικά keys που υπάρχουν σε μια εγγραφή στα 2 arrays , θα συγχωνευτούν και θα μπουν σε 1 array, όπου αν κατάλαβα καλά είναι και το ζητούμενο.

 

data = data() # το json σου.
names = data['names']
another = data['another']
new_data = []

for n in names:
	another_id_1 = {}; another_id_2 = {}
	try: another_id_1 = {k:v for k,v in [a for a in another if a['id'] == n['id1']][0].items() if k not in n.keys() and k != "id"}
	except: pass
	try: another_id_2 = {k:v for k,v in [a for a in another if a['id'] == n['id2']][0].items() if k not in n.keys() and k not in another_id_1.keys() and k != "id"}
	except: pass

	merged = { **n, **another_id_1, **another_id_2} # Python 3.5 +
	new_data.append(merged)

#αποθήκευση σε νέο αρχείο json
with open("new_data.json", "w", encoding = "utf-8") as f:
	f.write(json.dumps({"names":new_data}))

EDIT:  Ξέχασα να σημειώσω, πως το τελικό array "κρατάει" τα id1,id2 που υπάρχουν στο αρχικό names μιας και δεν ξέρω από που προκύπτουν αυτά τα ids και ποιο θέλεις να κρατήσεις.

Επεξ/σία από ralloss
  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...