【问题标题】:JSON.NET, XmlSerializer and "Specified" propertyJSON.NET、XmlSerializer 和“指定”属性
【发布时间】:2011-04-06 21:21:33
【问题描述】:
我有一个 REST 服务,它以 JSON 和 XML 作为输入,并使用反序列化的内容对外部服务进行 SOAP 调用。用于反序列化的类是从 SOAP 服务的 wsdl 自动生成的。我在 XML 请求的情况下使用 XmlSerializer,我想对 JSON 使用 Newton JSON.NET JsonSerializer。
现在我有一个问题,WSDL 生成的类包含可选原子值(例如 bool、int 等)的“指定”属性。这由 XmlSerializer(根据接收到的 XML 设置属性)而不是由 Newton JSON.NET Serializer 处理。我不想强制调用者将 XXXSpecified 元素添加到 JSON 字符串中。
如何使用 JSON.NET 序列化程序处理“指定”属性?
【问题讨论】:
标签:
xml-serialization
json.net
xmlserializer
【解决方案1】:
我的解决方案:
class MyContractResolver : DefaultContractResolver
{
private JsonObjectContract objectContract = null;
public override JsonContract ResolveContract(Type type)
{
JsonContract contract = base.ResolveContract(type);
objectContract = contract as JsonObjectContract;
return contract;
}
public void RemoveProperty(string name)
{
if (objectContract != null)
{
objectContract.Properties.Remove(objectContract.Properties.First(
p => p.PropertyName == name));
}
}
public void AtomarOptinalType(string name, bool specified)
{
if (objectContract != null)
{
if (!specified)
{
JsonProperty prop = objectContract.Properties.First(
p => p.PropertyName == name);
objectContract.Properties.Remove(prop);
}
RemoveProperty(name + "Specified");
}
}
}
然后在生成的类的扩展中:
public partial class MyGeneratedClass
{
[OnDeserializing]
internal void OnDeserializingMethod(StreamingContext context)
{
this.PropertyChanged +=
new System.ComponentModel.PropertyChangedEventHandler(
MyGeneratedClass_PropertyChanged);
}
[OnSerializing]
internal void OnSerializingMethod(StreamingContext context)
{
MyContractResolver cr = context.Context as MyContractResolver;
if (cr != null)
{
cr.AtomarOptinalType("MyAtomarOptionalProperty",
this.MyAtomarOptionalPropertySpecified);
}
}
void MyGeneratedClass_PropertyChanged(object sender,
System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "MyAtomarOptionalProperty")
{
this.MyAtomarOptionalPropertySpecified = true;
}
}
}