(Βλέπω ότι έγραψα λογίδριο, οπότε ρωτάω από τώρα ποιά είναι η πηγή του 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