2

たとえば、json文字列があります

{"timestamp":1362463455, "features" : {"one":true, "two":false}}

DataContractJsonSerializerクラスにデシリアライズしたい:

[DataContract]
public class MyClass
{
    [DataMember(Name = "timestamp")]
    public int Timestamp { get; set; }

    [DataMember(Name = "features")]
    public Dictionary<string, bool> Features { get; set; }
}

しかし、処理中にエラーが発生しました"ArgumentException"。デシリアライズに問題がありDictionaryます。タイムスタンプのみをデシリアライズする場合、エラーは発生しません。これには辞書が最適な構造だと思いました。しかし、それは機能しません。私はSOでこの答えを確認しましたがDictionary<string, object>、あまり機能しません。たぶん、使用例では:

DataContractJsonSerializerSettings settings =
        new DataContractJsonSerializerSettings();
settings.UseSimpleDictionaryFormat = true;

しかし、私はDataContractJsonSerializerSettingsWindowsPhoneでは使用できません。

申し訳ありませんが、私の質問が2倍の場合。

よろしくお願いします。

4

1 に答える 1

0

@アレクサンドル

オブジェクトをjsonからyourClassCustomObjectに逆シリアル化するのに役立つコードを書いています。

private async Task<List<MyClass>> MyDeserializerFunAsync()
{
    List<MyClass> book = new List<MyClass>();
    try
    {
       //I am taking my url from appsettings. myKey is my appsetting key. You can write direct your url.
       string url = (string)appSettings["mykey"];
       var request = HttpWebRequest.Create(url) as HttpWebRequest;
       request.Accept = "application/json;odata=verbose";
       var factory = new TaskFactory();
       var task = factory.FromAsync<WebResponse>(request.BeginGetResponse,request.EndGetResponse, null);
       var response = await task;
       Stream responseStream = response.GetResponseStream();
       string data;
       using (var reader = new System.IO.StreamReader(responseStream))
       {
           data = reader.ReadToEnd();
       }
       responseStream.Close();
       DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(List<MyClass>));
       MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(data));
       book = (List<MyClass>)json.ReadObject(ms);
       return book;
   }
} 

上記のコードは私の wp8 アプリケーションで動作しており、試してみるとより高速であり、役に立ちます。非同期操作を実行していますが、MyClass の戻り値の型で簡単なメソッドを作成できます。

于 2013-11-18T05:39:26.300 に答える