zoukankan      html  css  js  c++  java
  • JSON 转成 C# 动态类

    任意 JSON 转成 C# 动态类,无需事先声明一个C#类型,实现json字符串转成dynamic 类

    示例:

    class Program
    {
    staticvoid Main(string[] args)
    {
    string json ="{name:'hooyes',pwd:'hooyespwd',books:{a:'红楼梦',b:'水浒传',c:{arr:['宝玉','林黛玉']}},arr:['good','very good']}";

    dynamic dy
    = ConvertJson(json);

    Console.WriteLine(dy.name);

    Console.WriteLine(dy.books.a);

    Console.WriteLine(dy.arr[
    1]);

    foreach (var s in dy.books.c.arr)
    {
    Console.WriteLine(s);
    }

    Console.Read();

    }
    static dynamic ConvertJson(string json)
    {
    JavaScriptSerializer jss
    =new JavaScriptSerializer();
    jss.RegisterConverters(
    new JavaScriptConverter[] { new DynamicJsonConverter() });
    dynamic dy
    = jss.Deserialize(json, typeof(object)) as dynamic;
    return dy;
    }
    }

    用到两个自定义的类:DynamicJsonConverter,DynamicJsonObject

    代码
    publicclass DynamicJsonConverter : JavaScriptConverter
    {
    publicoverrideobject Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
    if (dictionary ==null)
    thrownew ArgumentNullException("dictionary");

    if (type ==typeof(object))
    {
    returnnew DynamicJsonObject(dictionary);
    }

    returnnull;
    }

    publicoverride IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
    thrownew NotImplementedException();
    }

    publicoverride IEnumerable<Type> SupportedTypes
    {
    get { returnnew ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(object) })); }
    }
    }
    代码
    publicclass DynamicJsonObject : DynamicObject
    {
    private IDictionary<string, object> Dictionary { get; set; }

    public DynamicJsonObject(IDictionary<string, object> dictionary)
    {
    this.Dictionary = dictionary;
    }

    publicoverridebool TryGetMember(GetMemberBinder binder, outobject result)
    {
    result
    =this.Dictionary[binder.Name];

    if (result is IDictionary<string, object>)
    {
    result
    =new DynamicJsonObject(result as IDictionary<string, object>);
    }
    elseif (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
    {
    result
    =new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x =>new DynamicJsonObject(x as IDictionary<string, object>)));
    }
    elseif (result is ArrayList)
    {
    result
    =new List<object>((result as ArrayList).ToArray());
    }

    returnthis.Dictionary.ContainsKey(binder.Name);
    }
    }
  • 相关阅读:
    机器学习算法优秀性:衡量指标
    MapReduce and Pregel
    K-d 树对聚类算法进行预处理
    论文中的算法描述 By 薛磊
    批判性思维《描述性假设》
    论文中的数学符号使用
    HOOK别人的dylib(HOOK cydia里面的插件)
    关于某听书软件的开通20年会员的心路历程
    Aspects 源码学习
    Undefined symbols for architecture arm64(其cpu架构)
  • 原文地址:https://www.cnblogs.com/hooyes/p/DynamicJsonConverter.html
Copyright © 2011-2022 走看看