Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Δημιουργία κλάσης από JSON;

Îåêßíçóå áðü ôï ìÝëïò dimos.homatas. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 11-02-2011, 09:28. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  10-02-2011, 15:40 63168

    Δημιουργία κλάσης από JSON;

    Καλησπέρα,

    υπάρχει κάποιο εργαλείο παρόμοιο με το XSD μόνο που να διαβάζει JSON και να δημιουργεί .ΝΕΤ classes; (Προτιμώ C# αλλά και σε VB δεν με χαλάει).

    Ή πρέπει να κάνω το JSON -> XML -> XSD ;

    Ευχαριστώ

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  10-02-2011, 16:32 63171 σε απάντηση της 63168

    Απ: Δημιουργία κλάσης από JSON;

    (Βλέπω ότι έγραψα λογίδριο, οπότε ρωτάω από τώρα ποιά είναι η πηγή του Json και πως θέλεις να το χρησιμοποιήσεις? REST service, NoSQL database, άλλο ?)

    Ουσιαστικά ψάχνεις για ένα proxy σε κάποιο JSON web service ή κάποια NoSQL βάση. Παρότι υπάρχουν JSON serializers όπως το Json.NET ή το JavaScriptSerializer του ίδιου του .NET Framework δεν βρήκα ούτε έχω ακούσει για proxy generators. Το πρόβλημα με το Json είναι ότι δεν έχει κάποιο σχήμα για να μπορείς να φτιάξεις proxies εκ των προτέρων. Κάθε αντικείμενο απλά περιέχει properties με τιμές και τίποτε δεν εμποδίζει το ίδιο property να έχει διαφορετικά δεδομένα από τη μία κλήση στην άλλη.

    Ο μόνος ασφαλής τρόπος να φτιάξεις ένα proxy είναι η πηγή των δεδομένων σου να παρέχει με άλλο τρόπο κάποιο schema για να μπορέσεις να φτιάξεις το proxy. Για παράδειγμα, τα ΑSMX/WCF Services επιστρέφουν μεν JSON αλλά παρέχουν το σχήμα μέσω του WSDL. Τα WCF Data Services κάνουν το ίδιο μέσω του Atom protocol. Το Visual Studio καταλαβαίνει αυτά τα δύο schemas και έτσι σου δημιουργεί το proxy.

    Αν η πηγή σου παρέχει κάποιο WSDL (π.χ. έχει και κλασσικά web services) μπορείς να δημιουργήσεις proxies μέσω του Visual Studio και μετά να χρησιμοποιήσεις το DataContractJSonSerializer για να κάνεις κατευθείαν deserialize το Json στα proxy objects.

    Αντί να φτιάξεις proxies μπορείς να εκμεταλλευτείς το dynamic keyword της C# 4 και να δημιουργήσεις αντικείμενα τα οποία έχουν ως properties τιμές που διαβάζεις από JSon. Δες αυτό το παράδειγμα που συνδυάζει το JavaScriptSerializer με το dynamic για να δημιουργήσει αντικείμενα από JSon. Ένα json string της μορφής:

    { 
        "glossary": { 
            "title": "example glossary", 
            "GlossDiv": { 
                "title": "S", 
                "GlossList": { 
                    "GlossEntry": { 
                        "ID": "SGML", 
                        "SortAs": "SGML", 
                        "GlossTerm": "Standard Generalized Markup Language", 
                        "Acronym": "SGML", 
                        "Abbrev": "ISO 8879:1986", 
                        "GlossDef": { 
                            "para": "A meta-markup language, used to create markup languages such as DocBook.", 
                            "GlossSeeAlso": ["GML", "XML"] 
                        }, 
                        "GlossSee": "markup" 
                    } 
                } 
            } 
        } 
    }

    μετατρέπεται σε αντικείμενα με απλές κλήσεις όπως

    JavaScriptSerializer jss = new JavaScriptSerializer(); 
    jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });
    dynamic glossaryEntry = jss.Deserialize(json, typeof(object)) as dynamic;
    Console.WriteLine("glossaryEntry.glossary.title: " + glossaryEntry.glossary.title);

    Όπως θα δεις στο post, ο κώδικας ο οποίος φτιάχνει τα αντικείμενα είναι εξαιρετικά απλός.

    Το μείον είναι ότι δεν μπορείς να ελέγξεις κατά το compile αν έχεις γράψει σωστά τα ονόματα των properties. Από την άλλη, το JSon δεν σου δίνει και καμμία εγγύηση ότι τα properties αυτά θα υπάρχουν όντως όταν θα κάνεις την κλήση στο runtime. Ουσιαστικά αυτό που χάνεις είναι το Intellisense που θα σου έδινε ένα proxy.

    Να ρωτήσω τέλος, όπως και στην αρχή, από που έρχεται το JSon? Αν, για παράδειγμα, έρχεται από κάποιο NoSQL database ίσως υπάρχουν ήδη clients τα οποία θα σου λύσουν το πρόβλημα. Αν έρχεται από κάποιο REST Service, ίσως να υπάρχουν ήδη proxy generators ή wsdl metadata


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-02-2011, 17:40 63183 σε απάντηση της 63171

    Απ: Δημιουργία κλάσης από JSON;

    Αν χρησιμοποιούσα την έκδοση 4 (.NET, C#) δεν θα είχα πρόβλημα. 

    Βασικά η πηγή είναι το Graph API του FB. Έχω βάλει το ERP μας να κάνει ποστ κλπ σε σελίδες πελατών. Το θέμα είναι ότι το καημένο το παλιό REST API, ή μάλλον καλύτερα, ο Wrapper που κυκλοφορούσε βγάζει κάτι timeout, άλλες μέθοδοι δεν δουλεύουν σωστά (πλέον) κλπ κλπ.

    Κοίταξα το νέο Facebook SDK που βρίσκεται στο Codeplex, αλλά δουλεύει με v 4 (dynamics Κλπ) ενώ στην εταιρία έχουμε 3.5 .

    Οπότε, από το να φτιάξω το very fat client μας για .ΝΕΤ 4 (είναι και λίγο μπαμπάτσικο, χώρια που είχε ξεκινήσει να φτιάχνεται με .ΝΕΤ 1.1, ούτε partial classes ούτε τίποτα) και πιθανώς να φάω τα νιάτα μου για να γίνει πορτ (άλλο θέμα αυτό, θα το πιάσω μελλοντικά) είπα να ασχοληθώ με το Graph. Ταλαιπωρήθηκα λίγο με το authentication (ανέφερα τι καλά δούλευε το παλαιότερο SDK?) αλλά στό τέλος "άνοιξαν" οι πύλες του FB.

    Τώρα, το FB τα επιστρέφει όλα σε JSON. Αν είχα κάτι παρεμφερές με το XSD Θα μπορούσα να φτιάξω τις κλάσεις από τα επιστρεφόμενα strings.

    Δυστυχώς, δεν έχω dynamics...

    Το θέμα είναι να γλιτώσω την δημιουργία των κλάσεων με το χέρι. 

    Σαν λιγότερη χειρότερη λύση βλέπω να μπαίνει το ενδιάμεσο βήμα XML. Βέβαια, ψάχνοντάς το, βρήκα κάποιους που γκρίνιαζαν για την λανθασμένη μετατροπή των τύπων δεδομένων, αλλά δεν το είδα περαιτέρω.



    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  10-02-2011, 17:46 63184 σε απάντηση της 63183

    Re: Απ: Δημιουργία κλάσης από JSON;

    Καλησπέρα,

    Ίσως σε σώσει αυτός ο φοβερός κυριούλης http://james.newtonking.com/projects/json-net.aspx (James Newton-King).
    Δεν προσφέρει ακριβώς αυτό που θες αλλά μπορεί να σε βοηθήσει να κάνεις conversions από τα οποία να φτάσεις να κάνεις αυτό που θες. Σε κάθε περίπτωση προσφέρει μια πολύ χρήσιμη βιβλιοθήκη όταν δουλεύεις με JSON και .Net.

    Βασίλης

     

  •  10-02-2011, 19:07 63185 σε απάντηση της 63184

    Απ: Re: Απ: Δημιουργία κλάσης από JSON;

    Βασίλη ευχαριστώ, το έχω υπ'όψιν μου το JSON.NET. Είναι όντως εργαλείο της προκοπής!

    Τελικά (μετά από ένα μπανάκι) φτάνω στο συμπέρασμα ότι εάν καθίσω και τα φτιάξω με το χέρι είναι δυο μέρες δουλειά. Δεν τα χρειάζομαι όλα, χρειάζομαι βασικά πράγματα. Απλά δεν θα φτιάξω αντικείμενα κομπλέ σαν αυτά που επιστρέφει το Graph, θα τα κάνω πιο μινιμαλιστικά, αυτά που μας χρειάζονται, και από δω παν wrappers, sdks κλπ...

    Φαίνεται πάντως ότι η πηγή του κακού (τελικά) είναι το 3.5...

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  10-02-2011, 23:21 63198 σε απάντηση της 63185

    Απ: Re: Απ: Δημιουργία κλάσης από JSON;

    Κοίτα, δεν αποφάσισε ξαφνικά το .NET 3.5 να πάψει να δουλεύει. Αφού το είπες κι εσύ ο ίδιος, άλλαξε το API του Facebook. Όσον αφορά το .NET 4.0, γιατί δεν δοκιμάζεις απλά να αλλάξεις την έκδοση του Framework στο project σου? Δεν είναι δα και τόσο φοβερές οι διαφορές. Το πιο πιθανό είναι ότι με ένα recompile θα καθαρίσεις
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-02-2011, 23:49 63199 σε απάντηση της 63198

    Απ: Re: Απ: Δημιουργία κλάσης από JSON;

    Παναγιώτης Καναβός:
    Κοίτα, δεν αποφάσισε ξαφνικά το .NET 3.5 να πάψει να δουλεύει. Αφού το είπες κι εσύ ο ίδιος, άλλαξε το API του Facebook.

    Rephrase: Το γεγονός ότι ακόμα εγώ χρησιμοποιώ 3.5 Big Smile Δυστυχώς δεν είναι δική μου απόφαση ... 

    Θα μπορούσα άραγε να φτιάξω ένα DLL σε 4 και να το κολλήσω μετά στο solution μου; Χμμμ... κάτι τέτοιο βλέπω να συμβαίνει.

    Μη φτάσω σε σημείο να κάνω κάνα δικό μου wrapper στο τέλος!

    Αλλά και το parsing των JSON μου φαίνεται αρκετά εύκολο από την άλλη. Για απλά αντικείμενα τουλάχιστον.

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  10-02-2011, 23:54 63200 σε απάντηση της 63199

    Απ: Re: Απ: Δημιουργία κλάσης από JSON;

    Πρέπει όλα τα DLL να τρέχουν στο ίδιο version. Αλλά γιατί δεν δοκιμάζεις απλά να κάνεις recompile όλο το solution? Κάτι μου λέει ότι δεν θα έχεις σοβαρά προβλήματα, πέρα από το να βάλεις τα σωστά references αν γκρινιάξει το Visual Studio.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  11-02-2011, 08:52 63204 σε απάντηση της 63200

    Απ: Re: Απ: Δημιουργία κλάσης από JSON;

    Ομολογώ ότι ακόμα δεν το κοίταξα το 2010. Παρ'όλα αυτά, και πέρα από πιθανά θέματα νομιμότητας, το solution έχει μέσα web services, 5-6 project σε c# και ένα τεράστιο κακογραμμένο project σε VB το οποίο μεταλλασσόταν ανά τα χρόνια (ξεκίνησε από την έκδοση .ΝΕΤ 1).

    Λες να το δοκιμάσω; Μετά σκέφτομαι ότι πρέπει να γίνουν και τα σχετικά updates (framework 4, updater για το πρόγραμμα έχω φτιάξει εγώ) και στους clients... 

    Και το ερώτημα είναι εάν αξίζει ή είναι κάτι που, δεδομένης της δομής του solution, θα ήταν καλό να γίνει σε επόμενη έκδοση (εάν υπάρξει).

    Ευχαριστώ πάντως για το πολύτιμο feedback.

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  11-02-2011, 09:28 63206 σε απάντηση της 63204

    Απ: Re: Απ: Δημιουργία κλάσης από JSON;

    Εδώ έκανες τη μετάβαση από 1.1 σε 2.0, που όντως είχε ασυμβατότητες, το .NET 4 δεν θα είναι πρόβλημα. Τα περί νομιμότητας δεν τα κατάλαβα, αν έχετε partnership ή MSDN έχετε και VS 2010. Εξάλλου, το μόνο που έχεις να κάνεις είναι να .... ανοίξεις το solution στο VS 2010 και να αλλάξεις το version του framework


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems