Json.Net自定义序列化

Json.Net自定义序列化,json,serialization,json.net,Json,Serialization,Json.net,我正在序列化一个对象集合,其中包含一个名为DynamicProperties的字典 发出的默认Json如下所示: [{"dynamicProperties":{"WatchId":7771,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5580"}}, {"dynamicProperties":{"WatchId":7769,"Issues":0,"WatchType":"x","Location":

我正在序列化一个对象集合,其中包含一个名为DynamicProperties的字典

发出的默认Json如下所示:

[{"dynamicProperties":{"WatchId":7771,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5580"}},
{"dynamicProperties":{"WatchId":7769,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5574"}},
{"dynamicProperties":{"WatchId":7767,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5572"}},
{"dynamicProperties":{"WatchId":7765,"Issues":0,"WatchType":"y","Location":"Equinix Source","Name":"highlight_SM"}},
{"dynamicProperties":{"WatchId":8432,"Issues":0,"WatchType":"y","Location":"Test Devices","Name":"Cisco1700PI"}}]
[{"WatchId":7771,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5580"},
{"WatchId":7769,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5574"},
{"WatchId":7767,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5572"},
{"WatchId":7765,"Issues":0,"WatchType":"y","Location":"Equinix Source","Name":"highlight_SM"},
{"WatchId":8432,"Issues":0,"WatchType":"y","Location":"Test Devices","Name":"Cisco1700PI"}]
我希望生成如下所示的Json:

[{"dynamicProperties":{"WatchId":7771,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5580"}},
{"dynamicProperties":{"WatchId":7769,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5574"}},
{"dynamicProperties":{"WatchId":7767,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5572"}},
{"dynamicProperties":{"WatchId":7765,"Issues":0,"WatchType":"y","Location":"Equinix Source","Name":"highlight_SM"}},
{"dynamicProperties":{"WatchId":8432,"Issues":0,"WatchType":"y","Location":"Test Devices","Name":"Cisco1700PI"}}]
[{"WatchId":7771,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5580"},
{"WatchId":7769,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5574"},
{"WatchId":7767,"Issues":0,"WatchType":"x","Location":"Equinix Source","Name":"PI_5570_5572"},
{"WatchId":7765,"Issues":0,"WatchType":"y","Location":"Equinix Source","Name":"highlight_SM"},
{"WatchId":8432,"Issues":0,"WatchType":"y","Location":"Test Devices","Name":"Cisco1700PI"}]
通过阅读Json.Net文档,看起来我可以为我的类构建一个CustomContractResolver,但是我找不到关于如何进行此操作的任何详细信息。。。有人能告诉我应该往哪个方向看吗

下面是我试图序列化的类

我需要一个允许动态风格行为的类,并且可以通过WCF进行序列化和反序列化

 [DataContract]
public class SerializableDynamicObject : IDynamicMetaObjectProvider
{
    [DataMember]
    private IDictionary<string, object> dynamicProperties = new Dictionary<string, object>();

    #region IDynamicMetaObjectProvider implementation
    public DynamicMetaObject GetMetaObject(Expression expression)
    {
        return new SerializableDynamicMetaObject(expression,
            BindingRestrictions.GetInstanceRestriction(expression, this), this);
    }
    #endregion



    #region Helper methods for dynamic meta object support
    internal object setValue(string name, object value)
    {
        dynamicProperties.Add(name, value);
        return value;
    }

    internal object getValue(string name)
    {
        object value;
        if (!dynamicProperties.TryGetValue(name, out value))
        {
            value = null;
        }
        return value;
    }

    internal IEnumerable<string> getDynamicMemberNames()
    {
        return dynamicProperties.Keys;
    }
    #endregion
}

实现ISerializable

[DataContract]
public class SerializableDynamicObject : IDynamicMetaObjectProvider, ISerializable
{
    [DataMember]
    private IDictionary<string, object> dynamicProperties = new Dictionary<string, object>();

    #region IDynamicMetaObjectProvider implementation
    public DynamicMetaObject GetMetaObject(Expression expression)
    {
        return new SerializableDynamicMetaObject(expression,
            BindingRestrictions.GetInstanceRestriction(expression, this), this);
    }
    #endregion



    #region Helper methods for dynamic meta object support
    internal object setValue(string name, object value)
    {
        dynamicProperties.Add(name, value);
        return value;
    }

    internal object getValue(string name)
    {
        object value;
        if (!dynamicProperties.TryGetValue(name, out value))
        {
            value = null;
        }
        return value;
    }

    internal IEnumerable<string> getDynamicMemberNames()
    {
        return dynamicProperties.Keys;
    }
    #endregion

    #region ISerializable Members

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        foreach (var key in dynamicProperties.Keys)
        {
            info.AddValue(key.ToString(), dynamicProperties[key]);
        }
    }

    #endregion
}
这是程序的输出:


[{WatchId:7771,问题:0,位置:示例位置1,名称:示例名称1},{WatchId:7771,问题:0,位置:示例位置2,名称:示例名称2},{WatchId:7771,问题:0,位置:示例位置3,名称:示例名称3}]

能否显示序列化代码?已更新以包含要序列化的类我无法更改类的结构-我只需要控制它的序列化方式,然后在SerializableDynamicObject的类声明上实现ISerializable,您将获得所需的结果。这允许序列化工作,但它在通过WCF发送时无法反序列化。