1

これは本当に私を困惑させます。ASP.NET Web サービスから取得した次の JSON 文字列を逆シリアル化しようとしています。

"{\"d\":{\"__type\":\"KPCServer.LogonResult\",\"User\":{\"UserId\":\"affaa328-5b53-430e-991a-22674ede6faf\",\"Email\":\"test@test.com\",\"Alias\":\"Mike\",\"FullName\":\"Mike Christensen\",\"Password\":\"secret\",\"Location\":\"Redmond, WA\",\"ImageUrl\":null,\"DateOfBirth\":\"\\/Date(-62135568000000)\\/\",\"LastLogon\":\"\\/Date(1350450228000)\\/\",\"UserSince\":\"\\/Date(1197980020000)\\/\",\"MailingList\":true,\"Bio\":\"Test\"},\"NewUser\":false,\"Ticket\":\"FJEjfje87fjef88fe8FAF8fA88fAjk+AFJ9fja9Fa9Ff99aJF9aFjfA99fjaBFJ7zqmlcHn9Dfw=\"}}"

私は次のタイプを持っています:

public class User
{
   public Guid UserId { get; set; }
   public string Email { get; set; }
   public string Alias { get; set; }
   public string FullName { get; set; }
   public string Password { get; set; }
   public string Location { get; set; }
   public string ImageUrl { get; set; }
   public DateTime DateOfBirth { get; set; }
   public DateTime LastLogon { get; set; }
   public DateTime UserSince { get; set; }
   public bool MailingList { get; set; }
   public string Bio { get; set; }
}

[DataContract(Name="KPCServer.LogonResult")]
public class LogonResult
{
   [DataMember] public User User { get; set; }
   [DataMember] public bool NewUser { get; set; }
   [DataMember] public string Ticket { get; set; }
}

[DataContract]
[KnownType(typeof(LogonResult))]
public class Result<T>
{
   [DataMember]
   public T d { get; set; }
}

次に、次を使用して文字列を逆シリアル化しようとします。

using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
   DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Result<T>));
   Result<T> result = serializer.ReadObject(stream) as Result<T>;

   return result.d;
}

注:上記のメソッドでTは、タイプはLogonResultです。

ただし、次の例外が発生しReadObjectます。

System.Runtime.Serialization.SerializationException was unhandled by user code
  HResult=-2146233076
  Message=JSON contains a '__type' member specifying the data contract name ':KPCServer.LogonResult'. The deserializer has no knowledge of any type that maps to this contract. Add the type corresponding to 'KPCServer.LogonResult' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to DataContractSerializer. You can also often eliminate this error by avoiding the use of derived types where the JSON is produced.
  Source=System.ServiceModel.Web
  InnerException: 

私が実行した場合:

json = json.Replace("_type", "_blah");

その後、すべてが正常に機能します。これは、Windows Phone 8 で Silverlight を使用しています。

4

1 に答える 1

3

これは、次の事実によるものです。

"\"__type\":\"KPCServer.LogonResult\""

データ コントラクト名前空間が含まれていません。DataContractAttributeこれはonを変更することで修正されLogonResultます:

[DataContract(Name = "KPCServer.LogonResult", Namespace="")]
public class LogonResult
{
    [DataMember]
    public User User { get; set; }
    [DataMember]
    public bool NewUser { get; set; }
    [DataMember]
    public string Ticket { get; set; }
}
于 2012-11-24T08:48:04.523 に答える