3

私は今日の午後、文字列内でJSONの逆シリアル化を実装しようとしてかなりの時間を費やしました。最初は、環境がSilverlightであるため、 DataContractJsonSerializerを使用していましたが、すぐに使用できる辞書の使用をサポートしていないようです(他の多くの場合に発生) SOの質問)。

別の方法として、当面はJSON.NETを使用することにしました(前述のSOの質問への回答に基づく)。次の問題が発生しました。

以下のJSONを逆シリアル化したい:

{
    "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,
             }
}

次のオブジェクト内に配置します(辞書内のdoubleが必要です)。

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; }
}

これを実際に機能させるための私の最新の試みは以下のとおりです。

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

ただし、これにより次の例外が発生します。

アセンブリ'System.Core、Version = 3.7.0.0、Culture = neutral、PublicKeyToken=969DB8053D3322AC'からタイプ'System.Dynamic.IDynamicMetaObjectProvider'を読み込めませんでした。

あなたが見ることができるものに基づいて、私のアプローチは完全に間違っているのか、それとも私は男子生徒の間違いを犯しているだけですか(または両方!)

御時間ありがとうございます!

4

3 に答える 3

1

The exception message itself appears to be a known problem as raised in this SO question:

Moving to JSON.NET 4.0.3 broke my app

After using Nuget to install the latest package with all necessary dependencies (I manually downloaded the .DLL's from the CodePlex project previously) the code worked with no additional changes.

Thank you to the users who provided solutions.

于 2012-04-12T08:03:54.317 に答える
1

私はそれがあなたを助けると思います:

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

StreamReaderを使用する必要があるかどうかはわかりませんが、とにかく何を使用しますか?

ちなみに私args.Resultはjson文字列だと思います。

于 2012-04-11T23:31:28.590 に答える
0

あなたの例外によると:(単純なグーグル検索がこの答えを引き出しました

プロジェクトが古いバージョンのSilverlightランタイムを参照しているようです。

確認するには、Visual Studioでプロジェクトプロパティを表示し、Silverlightのバージョンが4.0に設定されていることを確認します。

System.Windows.Controls.Navigationアセンブリを再確認し、通常は[Program Files] \ Microsoft SDKs \ Silverlight \ v4.0 \ Libraries \ Client\System.Windowsにある最新バージョンを参照していることを確認することもできます。 Controls.Navigation.dll

そして、次のとおりです。

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

JSON、配列ではなく、オブジェクトです。配列は次のようになります。

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

したがって、ソースを取得してJSONを適切にフォーマットするか、辞書に入力するためにこの特定の部分の逆シリアル化を手動で設定する必要があります。

于 2012-04-12T00:25:01.347 に答える