none
请问如何将一个dynamic类型的对象正确转换成json字符串? RRS feed

  • 问题

  • using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Dynamic;
    using System.Linq;
    using System.Text;
    using System.Web.Script.Serialization;
    
    
    namespace ConsoleApplication4
    {
        class Program
        {
            static void Main(string[] args)
            {
                dynamic d = new ExpandoObject();
                d.AA = "aa";
                d.BB = "bb";
    
                JavaScriptSerializer oSerializer = new JavaScriptSerializer();
                string sJSON = oSerializer.Serialize(d);
            }
        }
    
        
    }

    我希望将自己定义的dynamic类型变量d得到如下的json字符号串

    "{ \"AA\": \"aa\", \"BB\": \"bb\" }"

    而默认的JavaScriptSerializer有点问题~如果需要自己继承JavaScriptConverter那么应该怎么实现?有没有现成的方法?

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        // how to do
    }
    谢谢各位!


    博客园: dotNetDR_ 的博客 - 天杀下来的BUG,不怕有我来挡!

    博客园介绍: 博客园创立于2004年1月,是面向软件开发者的高品质IT技术社区,聚集了很多优秀的软件开发者和IT技术学习者。


    • 已编辑 dotNetDR_ 2012年8月16日 2:35 添加附件
    2012年8月16日 2:34

答案

  • 需要自己写一个转换器(System.Web.Script.Serialization.JavaScriptConverter),命名为ExpandoJSONConverter.cs:

    public class ExpandoJSONConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }
    
        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            var result = new Dictionary<string, object>();
            var dictionary = obj as IDictionary<string, object>;
    
            foreach (var item in dictionary)
                result.Add(item.Key, item.Value);
    
            return result;
        }
    
        public override IEnumerable<Type> SupportedTypes
        {
            get
            {
                return new ReadOnlyCollection<Type>(new Type[] { typeof(System.Dynamic.ExpandoObject) });
            }
        }
    }
    

    然后再注册到JavaScriptSerializer的实例上就可以了:

    JavaScriptSerializer oSerializer = new JavaScriptSerializer();
    oSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJSONConverter() });
    string sJSON = oSerializer.Serialize(d);
    
     我的项目里就用到了这个。


    如果有帮助,标记为答复!Mark as Answer if answered!

    • 已标记为答案 dotNetDR_ 2012年8月16日 7:44
    2012年8月16日 6:45
    版主

全部回复

  • 需要自己写一个转换器(System.Web.Script.Serialization.JavaScriptConverter),命名为ExpandoJSONConverter.cs:

    public class ExpandoJSONConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }
    
        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            var result = new Dictionary<string, object>();
            var dictionary = obj as IDictionary<string, object>;
    
            foreach (var item in dictionary)
                result.Add(item.Key, item.Value);
    
            return result;
        }
    
        public override IEnumerable<Type> SupportedTypes
        {
            get
            {
                return new ReadOnlyCollection<Type>(new Type[] { typeof(System.Dynamic.ExpandoObject) });
            }
        }
    }
    

    然后再注册到JavaScriptSerializer的实例上就可以了:

    JavaScriptSerializer oSerializer = new JavaScriptSerializer();
    oSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJSONConverter() });
    string sJSON = oSerializer.Serialize(d);
    
     我的项目里就用到了这个。


    如果有帮助,标记为答复!Mark as Answer if answered!

    • 已标记为答案 dotNetDR_ 2012年8月16日 7:44
    2012年8月16日 6:45
    版主
  • 你好,感谢你的回复。

    你的方法对变量为ExpandoObject类型的dynamic实例可以通过测试!

    但是对于自己实现DynamicObject类型的dynamic实例不支持!因为

    var dictionary = obj as IDictionary<string, object>;
    
    //dictionary = null

    博客园: dotNetDR_ 的博客 - 天杀下来的BUG,不怕有我来挡!

    博客园介绍: 博客园创立于2004年1月,是面向软件开发者的高品质IT技术社区,聚集了很多优秀的软件开发者和IT技术学习者。

    2012年8月16日 7:44