首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Json.Net CustomSerialization

Json.Net CustomSerialization
EN

Stack Overflow用户
提问于 2012-06-27 17:12:20
回答 1查看 370关注 0票数 0

我正在序列化一个对象集合,其中包含一个称为动态属性的字典。

发出的默认Json如下所示:

代码语言:javascript
复制
[{"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"}}]

我想生成的Json看起来像这样:

代码语言:javascript
复制
[{"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上序列化和反序列化。

代码语言:javascript
复制
 [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
}
EN

回答 1

Stack Overflow用户

发布于 2012-07-13 05:04:39

实施ISerializable

代码语言:javascript
复制
[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
}

现在在一个小的控制台应用程序中测试这段代码...

代码语言:javascript
复制
    static void Main(string[] args)
    {
        SerializableDynamicObject obj1 = new SerializableDynamicObject();
        obj1.setValue("WatchId", 7771);
        obj1.setValue("Issues", 0);
        obj1.setValue("Location", "sample location1");
        obj1.setValue("Name", "sample name 1");

        SerializableDynamicObject obj2 = new SerializableDynamicObject();
        obj2.setValue("WatchId", 7771);
        obj2.setValue("Issues", 0);
        obj2.setValue("Location", "sample location1");
        obj2.setValue("Name", "sample name 1");

        SerializableDynamicObject obj3 = new SerializableDynamicObject();
        obj3.setValue("WatchId", 7771);
        obj3.setValue("Issues", 0);
        obj3.setValue("Location", "sample location1");
        obj3.setValue("Name", "sample name 1");

        SerializableDynamicObject[] dictArray = new
        SerializableDynamicObject[] { 
            obj1, obj2, obj3
        };

        Newtonsoft.Json.JsonSerializer ser = new Newtonsoft.Json.JsonSerializer();
        ser.Serialize(Console.Out, dictArray);
}

这是程序的输出:

{"WatchId":7771,"Issues":0,"Location":"sample location1"," name ":"sample name 1"},{"WatchId":7771,"Issues":0,"Location":"sample location2","Name":"sample Name 2"},{"WatchId":7771,"Issues":0,"Location":"sample location3","Name":"sample name3"}

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11222920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档