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 回答