Json Strings und Objekte in IronPython de/serialisieren

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

Moin Moin,

habe mal wieder etwas IronPython spezifisches aus der .NET Welt (Silverlight)

Wenn ich mit IronPython Json verarbeiten möchte gibt es zunächst die Entscheidung aus welcher Welt ich mich da bediene.
1) Dot Net: http://james.newtonking.com/projects/json/help/
oder
2) eine reine Python Bibliothek verwenden, die auch unter IronPython im Silverlight Container funktioniert (also intern keine c-Bibliotheken verwendet)

bei 1 habe ich das Problem, dass ich nicht weiß, wie der Typ (also die Klasse) in Ironpython angegeben werden muss

c#:

Code: Alles auswählen

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output);
IronPython:?

und bei Variante 2 habe ich noch keine netten Libs gefunden, die direkt ein spezifisches Objekt erstellen können.
Hat jemand Tipps?


Vielen Dank im Voraus,
Sven
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Das `json`-Modul in der Standard Library (> 2.5 iirc) ist in purem Python geschrieben (es gibt optional ne C-Extension, aber falls die nicht geladen werden kann, wird eben das Purepythonding genutzt).

"Direkt Objekt erzeugen"? Du meinst anstatt eines Dictionaries direkt eins von "deinen" Klassen verwenden? Das geht mit o.g. Library.
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

Dauerbaustelle hat geschrieben:Das `json`-Modul in der Standard Library (> 2.5 iirc) ist in purem Python geschrieben (es gibt optional ne C-Extension, aber falls die nicht geladen werden kann, wird eben das Purepythonding genutzt).
Ich hab das jetzt mal mit simplejson ausprobiert http://code.google.com/p/simplejson/
Da hat es auf Anhieb nicht funktioniert, weil dort z.B. Decimal importiert wurde, was in der .NET Welt unter System liegt und nicht unter sys. Aber dies lies sich leicht verbessern.
Schwieriger ist es, dass str.decode() nicht vollständig in IronPython umgesetzt wurde (zumindest nicht in der Version, die ich gerade verwende) Dort fehlt der encoder 'hex'
Dauerbaustelle hat geschrieben: "Direkt Objekt erzeugen"? Du meinst anstatt eines Dictionaries direkt eins von "deinen" Klassen verwenden? Das geht mit o.g. Library.
Ein Traum wäre es, wenn eine Funktion die gefundenen Json(Object)Attribute nimmt und guckt, ob diese als Property existiert und dann zuweist.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

proofy hat geschrieben:
Dauerbaustelle hat geschrieben: "Direkt Objekt erzeugen"? Du meinst anstatt eines Dictionaries direkt eins von "deinen" Klassen verwenden? Das geht mit o.g. Library.
Ein Traum wäre es, wenn eine Funktion die gefundenen Json(Object)Attribute nimmt und guckt, ob diese als Property existiert und dann zuweist.
Wie soll das gehen? Python hat doch gar keine statische "Attributierung"?
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

Schon so etwas in der Art
http://docs.python.org/library/functions.html#property

Und darüber kann die .NET Welt auch zugreifen.
lunar

@Dauerbaustelle: Es ging um Eigenschaften, nicht um allgemeine Attribute. Eigenschaften werden als Deskriptoren im Namensraum der zugeordneten Klasse deklariert, und Klassen sind im Regelfall schon relativ statisch. Die gewünschte Funktion zu schreiben, ist mithin auch nicht schwer:

Code: Alles auswählen

def update_properties_from_mapping(obj, mapping):
    for key, value in mapping.iteritems():
        if isinstance(getattr(type(obj), key, None), property):
            setattr(obj, key, value)
"mapping" kann jedes mögliche Wörterbuch sein, also auch eines, dass aus JSON deserialisiert wurde.
proofy
User
Beiträge: 32
Registriert: Montag 21. März 2011, 12:47

@lunar, wau, vielen Dank
Antworten