JSON.NET、XmlSerializer和“Specified”属性

3
我有一个REST服务,接受JSON和XML作为输入,并使用反序列化后的内容进行SOAP调用到外部服务。用于反序列化的类是从SOAP服务的wsdl自动生成的。对于XML请求,我使用XmlSerializer,而对于JSON,我想使用Newton JSON.NET JsonSerializer。
现在我有一个问题,WSDL生成的类包含可选原子值(例如bool,int等)的“Specified”属性。这由XmlSerializer处理(它根据接收到的XML相应地设置属性),但不由Newton JSON.NET Serializer处理。我不想强制调用者向JSON字符串添加XXXSpecified元素。
如何使用JSON.NET序列化程序处理“Specified”属性?
1个回答

0

我的解决方案:

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;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接