0

私はクラスを持っています:

[DataContract]
public class A
{
    [DataMember]
    public B ArbitraryProperty { get; set;}
}

シリアル化する場合、「ArbitraryProperty」はクラス「B」の形式である必要があります。

[DataContract]
public class B
{
    [DataMember]
    public string ValueA { get; set; }
    [DataMember]
    public string ValueB { get; set; }
}

JSON 出力は次のとおりです。

{
    "ArbitraryProperty": { "ValueA": "I'm a value.", "ValueB": "I'm a value too!" }
}

ただし、サーバーから同じオブジェクトを取得すると、プロパティは次のような単純な文字列として返されます。

{
    "ArbitraryProperty": "I'm not a B, muahahaha!!!"
}

DataContractJsonSerializer に、値を「B」ではなく文字列に逆シリアル化する必要があることを知らせるには、トリックが必要です。

クラス「A」を設定する特別な方法はありますか? :/

助言がありますか?

4

1 に答える 1

0

これが正しい方法だとは思いません。読みやすさと使いやすさの正しい答えは、要求と応答クラスを適切に入力することだと思います。しかし...私が考えることができるのは、プロパティをobject強く型付けするのではなく、プロパティにすることだけです。値を割り当てるときに、正しい型を割り当てることを確認する必要があります。

public class A
{
    public object ArbitraryProperty { get; set; }
}

それでも適切にシリアル化されます。

var a = new A { ArbitraryProperty = new B { ValueA = "a", ValueB = "b" } };
var json = JsonConvert.SerializeObject(a);
Console.WriteLine(json);

オブジェクトが戻ってくると、デシリアライズによってその文字列がプロパティに入れられます。

json = "{'ArbitraryProperty':'This is some string'}";
a = JsonConvert.DeserializeObject<A>(json);

このコードは、JSON.NET からの単純なシリアル化/逆シリアル化で動作しますが、WebAPI や使用しているテクノロジが気に入るかどうかはわかりません。

于 2013-07-18T22:19:03.463 に答える