0

ここで投稿を読んで一日を過ごした後、私はまだこれを機能させることができないので、うまくいけば、これはここの誰かにとって理にかなっています.

Web サービスはこの単純な JSON を返します

{"d":{"__type":"TestWebServices.Person","Name":"Bob","FavoriteColor":"Green","ID":0}}

次に、C#コードを使用して逆シリアル化しています

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Person));
Person someone = (Person)jsonSerializer.ReadObject(responseStream);

このモデルを使用すると、誰かが作成されますが、すべてのプロパティが null です

[DataContract]
public class Person {
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string FavoriteColor { get; set; }
    [DataMember]
    public int ID { get; set; }
}

私はより文字通りになり、このモデルを使用しました

[DataContract]
public class Person {
    [DataMember]
    public PersonItem d { get; set; }
}
[DataContract]
public class PersonItem {
    [DataMember]
    public string __Type { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string FavoriteColor { get; set; }
    [DataMember]
    public int ID { get; set; }
}

そして、どこから始めればいいのかわからないこのエラーが発生しました

要素「:d」には、名前「:GEMiniWebServices.Person」にマップされるタイプのデータが含まれています。デシリアライザーは、この名前にマップされる型を認識しません。DataContractResolver の使用を検討するか、'TestWebServices.Person' に対応する型を既知の型のリストに追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストに追加します。

何かご意見は?ありがとう

4

2 に答える 2

1

__Type はオブジェクトの一部であってはなりません。シリアライザへのヒントです。また、JSON オブジェクトに含まれている型ヒントが不適切です。スタンドアロンの JSON シリアライゼーションは次のように述べています。

型の同一性を保持するために、複雑な型を JSON にシリアル化するときに「型ヒント」を追加できます。デシリアライザーはヒントを認識して適切に動作します。「型ヒント」は、キー名が「__type」(2 つのアンダースコアの後に「type」という単語が続く) の JSON キーと値のペアです。値は、"DataContractName:DataContractNamespace" の形式の JSON 文字列です (最初のコロンまでが名前です)。

型ヒントは、XML スキーマ インスタンス標準で定義され、XML のシリアライズ/デシリアライズ時に使用される xsi:type 属性に非常に似ています。

型ヒントと競合する可能性があるため、"__type" というデータ メンバーは禁止されています。

__type宣言を次のように書き換えるPerson:#TestWebServicesか、削除すると、次のように機能します。

namespace TestWebServices
{
    [KnownType(typeof(Person))]
    [DataContract]
    public class PersonWrapper
    {
        [DataMember]
        public Person d { get; set; }
    }
    [DataContract]
    public class Person
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string FavoriteColor { get; set; }
        [DataMember]
        public int ID { get; set; }
    }
}
于 2012-05-03T15:34:03.893 に答える
0

追加してみてください(そして、私はここでちょっとした刺し傷をしているので、正確な名前空間は間違っている可能性があります)

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/TestWebServices.Person")]

Person の DataContractAttribute に。

[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/TestWebServices.Person")]
public class Person {
    [DataMember]
    public PersonItem d { get; set; }
}
[DataContract]
public class PersonItem {
    [DataMember]
    public string __Type { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string FavoriteColor { get; set; }
    [DataMember]
    public int ID { get; set; }
}
于 2012-05-03T15:33:26.097 に答える