2012-04-11 2 views
3

Ich habe heute Nachmittag eine ganze Weile damit verbracht, die Deserialisierung von JSON in einer Zeichenfolge zu implementieren. Zuerst verwendete ich DataContractJsonSerializer, da meine Umgebung Silverlight ist, scheint aber nicht Unterstützung mit einem Wörterbuch out of the box (ausgelöst in vielen anderen SO-Fragen).Deserialisieren von JSON-String in ein Objekt - Silverlight

Als Alternative habe ich mich vorerst für JSON.NET entschieden (basierend auf den Antworten auf die oben genannten SO-Fragen) und habe folgendes Problem festgestellt.

Ich möchte unter die JSON deserialisieren:

{ 
    "disclaimer": "This data is collected from various providers and provided free of charge for informational purposes only, with no guarantee whatsoever of accuracy, validity, availability or fitness for any purpose; use at your own risk. Other than that - have fun, and please share/watch/fork if you think data like this should be free!", 
    "license": "Data collected from various providers with public-facing APIs; copyright may apply; not for resale; no warranties given.", 
    "timestamp": 1334183999, 
    "base": "USD", 
    "rates": { 
       "AED": 3.6732, 
       "AFN": 48.400002, 
       "ALL": 106.669998, 
      } 
} 

und legen Sie es in dem folgenden Objekt (Doppel im Wörterbuch erforderlich ist):

public class ExchangeData 
{ 
    public string disclaimer { get; set; } 
    public string license { get; set; } 
    public string timestamp { get; set; } 
    public string @base { get; set; } 
    public Dictionary<string, double> rates { get; set; } 
} 

Meine letzten Versuch tatsächlich das bekommen zu arbeiten ist unten:

StreamReader reader = new StreamReader(args.Result); 
ExchangeData data = JsonConvert.DeserializeObject<ExchangeData>(reader.ReadToEnd()); 

Aber dies ergibt die folgenden Ausnahmen auf:

nicht Art laden konnte 'System.Dynamic.IDynamicMetaObjectProvider' aus Assembly 'System.Core, Version = 3.7.0.0, Culture = neutral, PublicKeyToken = 969DB8053D3322AC'.

Nach dem, was Sie können mein Ansatz völlig falsch zu sehen ist, oder bin ich nur ein Schüler Fehler machen (oder beides!)

Vielen Dank für Ihre Zeit!

Antwort

1

Die Meldung Ausnahme selbst scheint ein bekanntes Problem zu sein, wie in dieser Frage SO angehoben:

Moving to JSON.NET 4.0.3 broke my app

Nach Nuget mit dem neuesten Paket mit allen notwendigen Abhängigkeiten zu installieren (ich die .dll manuell heruntergeladen aus das CodePlex-Projekt zuvor) arbeitete der Code ohne zusätzliche Änderungen.

Vielen Dank an die Benutzer, die Lösungen zur Verfügung gestellt haben.

1

denke ich, dass Sie helfen würde:

JavaScriptSerializer ser = new JavaScriptSerializer(); 
ExchangeData foo = ser.Deserialize<ExchangeData>(args.Result); 

ich wirklich sicher, dass Sie verwenden müssen, um Stream bin nicht, was tun Sie es trotzdem?

Übrigens nehme ich args.Result ist JSON String.

+0

Von dem, was ich verstehe, ist der JavaScriptSerializer nicht in Silverlight (wie in meiner Frage erwähnt), weshalb JSON.NET - ich bin offen für Alternativen, wenn es irgendwelche gibt. Zusätzlich ist args.Result ein Stream. –

0

Nach Ihrer Ausnahme: (a simple google search pulled up this answer)

Es scheint, wie Ihr Projekt auf eine ältere Version von Silverlight-Laufzeit verweist.

Um dies zu überprüfen, rufen Sie die Projekteigenschaft in Visual Studio auf und stellen Sie sicher, dass die Silverlight-Version auf 4.0 festgelegt ist.

Sie sollten auch die System.Windows.Controls.Navigation-Assembly überprüfen und sicherstellen, dass sie auf die neueste Version referenziert, die sich normalerweise in [Programme] \ Microsoft SDKs \ Silverlight \ v4.0 \ Libraries \ Client \ befindet. System.Windows.Controls.Navigation.dll

Und der folgende:

"rates": { 
      "AED": 3.6732, 
      "AFN": 48.400002, 
      "ALL": 106.669998, 
     } 

ist das nicht in JSON, ein Array, ist es ein Ziel.Ein Array würde wie folgt aussehen:

"rates": [ 
      "AED": 3.6732, 
      "AFN": 48.400002, 
      "ALL": 106.669998, 
     ] 

Also entweder Sie die Quelle richtig bekommen müssen formatiert es JSON ist, oder Sie müssen die Deserialisierung manuell Setup für dieses spezielle Stück ein Wörterbuch zu füllen.

+0

Dies war auf ein Problem mit der Verwendung der .DLL (und wurde seit einer späteren Version behoben). Unter Verwendung des Codes, den ich in meinen Fragen gepostet habe, wurde der JSON korrekt deserialisiert, einschließlich der Raten. Danke für Ihre Antwort in beide Richtungen. –

Verwandte Themen