使用不同类型反序列化JSON以进行序列化/反序列化

时间:2013-07-18 22:05:07

标签: c# json datacontractjsonserializer

我有一个班级:

[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”类? :/

有什么建议吗?

1 个答案:

答案 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或您正在使用的任何技术是否会喜欢它。