我有一个班级:
[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”类? :/
有什么建议吗?
答案 0 :(得分: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或您正在使用的任何技术是否会喜欢它。