7

Myweb-apiはユーザー オブジェクトを返します。そのオブジェクトにはDateTimeプロパティがあります。アプリケーションでそれを読んでいるときに、DateTime を表す文字列が有効ではないため、エラーが発生します。\Date ...

{System.Runtime.Serialization.SerializationException: User 型のオブジェクトを逆シリアル化中にエラーが発生しました。DateTime コンテンツ '1984-10-02T01:00:00' は、JSON に必要な '/Date(' で始まり、')/' で終わるわけではありません。--->

public static async Task<User> GetUser(string email)
    {
        try
        {
            using (HttpClient client = new HttpClient())
            {
                HttpResponseMessage response = await client.GetAsync(url + "?email="+email);
                if (response.IsSuccessStatusCode)
                {
                    string content = await response.Content.ReadAsStringAsync();
                    User user = DataService.Deserialize<User>(content);
                    return user;
                }
                return null;
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }

これは、逆シリアル化に使用する方法です。

public static T Deserialize<T>(string json) {
        try
        {
            var _Bytes = Encoding.Unicode.GetBytes(json);
            using (MemoryStream _Stream = new MemoryStream(_Bytes))
            {

                var _Serializer = new DataContractJsonSerializer(typeof(T));

                return (T)_Serializer.ReadObject(_Stream);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
4

5 に答える 5

9

JSON 仕様には、日付を交換するための標準形式はありません。そのため、JSONにはさまざまな形式の日付が存在します。

DataContractJsonSerializerDate()次のようなもので囲まれた 1970 年以降のミリ秒をカウントする形式で日付Date(1335205592410)をシリアル化し、同じ形式が に逆シリアル化されることを期待しDateTimeます。ただし、JSON 日付文字列として得られるのは ISO8601 形式です。これは、今日のほとんどのブラウザー/ソフトウェアが日付をシリアル化するために使用する形式です!

JavaScriptSerializer.Net の代替 JSON シリアライザーであり、JSON 文字列との間で匿名型を含むほぼすべての型をシリアル化でき、ISO8601 形式または形式DataContractJsonSerializerが提供する形式で JSON 日付を逆シリアル化できます。

を使用するJavaScriptSerializerと、Deserialize メソッドは次のようになります。

public static T Deserialize<T>(string json)
{
    return new JavaScriptSerializer().Deserialize<T>(json);
}
于 2012-12-26T19:12:09.903 に答える
9

これを回避するには、おそらく最も簡単な方法は、DataContract 型の値の型を「文字列」に設定することです。次に、.NET 日時を操作する必要がある場合は、文字列値に対して DateTime.Parse を実行する必要があります。これにより、逆シリアル化の問題が解消されます。シリアル化された元のクラスでは、日付に必要な書式が設定されていないため、最初から文字列値を使用していた可能性があります。

DateTime.Parse を実行すると、タイム ゾーン情報が存在する場合は、コンピューターの現地時間に変換されることに注意してください (これはばかげていると思います)。参考までに。

于 2012-12-26T17:34:56.707 に答える
7

パッケージJson.net(Newtonsoft.Json)を追加するときに修正する方法を見つけました。

public async static Task<T> Deserialize<T>(string json)
    {
        var value = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>(json);
        return value;
    }
于 2012-12-27T10:13:12.013 に答える
1

DataContractJsonSerializer の DateTimeFormat を次のように変更するだけです。

    public static T Deserialize<T>(string json) {
    try
    {
        var settings = new DataContractJsonSerializerSettings 
        {
            DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat("o")
        };
        var _Bytes = Encoding.Unicode.GetBytes(json);
        using (MemoryStream _Stream = new MemoryStream(_Bytes))
        {

            var _Serializer = new DataContractJsonSerializer(typeof(T), settings);

            return (T)_Serializer.ReadObject(_Stream);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
于 2014-07-07T11:00:26.953 に答える