zoukankan      html  css  js  c++  java
  • 组件Newtonsoft.Json实现object2json转换

    很多情况下,我们需要把数据类型做一些转换,供其它外部的子系统调用。

    最为典型的是生成json格式供javascript作调用。

    现成的组件Newtonsoft.Json可以实现object2json之间的转换。

    Newtonsoft.Json.JavaScriptConvert.SerializeObject(object)可以执行json的序列化,也是反序列化的方法。

    常见的场景:

    A系统提供用户资料(MemberInfo)给子系统B调用,但用户资料中有些内容是不能公开的,如Email地址。

    本文由骇客帝国()发布!转载和采集的话请不要去掉!谢谢。

    直接用Newtonsoft.Json.JavaScriptConvert.SerializeObject好像是不行的,它会把object中的所有属性列出。

    我的做法是这样的:

    定义一个特性类,该特性类只允许用于类的属性上

    view plaincopy to clipboardprint?
    [AttributeUsage(AttributeTargets.Property)]  
        public class DenyReflectionAttrubite : Attribute  
        {  
            public DenyReflectionAttrubite() { }  
        } 

    [AttributeUsage(AttributeTargets.Property)]
        public class DenyReflectionAttrubite : Attribute
        {
            public DenyReflectionAttrubite() { }
        }

    MemberInfo类
    view plaincopy to clipboardprint?
    public class MemberInfo  
        {  
            public int Uid  
            {  
                get;  
                set;  
            }  
            public string UserName  
            {  
                get;  
                set;  
            }  
              
            public string NickName  
            {  
                get;  
                set;  
            }  
            [DenyReflectionAttrubite]  
            public string Password  
            {  
                get;  
                set;  
            }  
           [DenyReflectionAttrubite]  
            public string Email  
            {  
                get;  
                set;  
            }  
    //.......................  

    public class MemberInfo
        {
            public int Uid
            {
                get;
                set;
            }
            public string UserName
            {
                get;
                set;
            }
           
            public string NickName
            {
                get;
                set;
            }
            [DenyReflectionAttrubite]
            public string Password
            {
                get;
                set;
            }
           [DenyReflectionAttrubite]
            public string Email
            {
                get;
                set;
            }
    //.......................
    }

    至于DenyReflectionAttrubite特性如何使用,下面就会提出。
    json生成
    view plaincopy to clipboardprint?
    public void Builder()  
            {  
                using (jsonWriter = new JsonTextWriter(sw))  
                {  
                      
                    jsonWriter.Formatting = Formatting.None;  
                    jsonWriter.Indentation = 4;  
                    jsonWriter.WriteStartObject();  
                      
                    jsonWriter.WritePropertyName("member");  
                    jsonWriter.WriteStartArray();  
                    jsonWriter.WriteStartObject();  
                    Type settingsType = this.member.GetType();  
                    foreach (PropertyInfo propertyInformation in settingsType.GetProperties())  
                    {  
                        try 
                        {  
                            //在这里对DenyReflectionAttrubite特性的属性跳过处理  
                            if (propertyInformation.GetCustomAttributes(typeof(DenyReflectionAttrubite), false).Length > 0) continue;     
                            object propertyValue = propertyInformation.GetValue(member, null);  
                            string valueAsString = propertyValue.ToString();  
                            if (propertyValue.Equals(null))  
                            {  
                                valueAsString = String.Empty;  
                            }  
                            if (propertyValue.Equals(Int32.MinValue))  
                            {  
                                valueAsString = String.Empty;  
                            }  
                            if (propertyValue.Equals(Single.MinValue))  
                            {  
                                valueAsString = String.Empty;  
                            }  
                            jsonWriter.WritePropertyName(propertyInformation.Name.ToLower());  
                            jsonWriter.WriteValue(valueAsString.Trim());  
                        }  
                        catch { }  
     
                    }  
     
                    jsonWriter.WriteEndObject();  
                    jsonWriter.WriteEnd();  
                    jsonWriter.WriteEndObject();  
                }  
            } 

    public void Builder()
            {
                using (jsonWriter = new JsonTextWriter(sw))
                {
                   
                    jsonWriter.Formatting = Formatting.None;
                    jsonWriter.Indentation = 4;
                    jsonWriter.WriteStartObject();
                   
                    jsonWriter.WritePropertyName("member");
                    jsonWriter.WriteStartArray();
                    jsonWriter.WriteStartObject();
                    Type settingsType = this.member.GetType();
                    foreach (PropertyInfo propertyInformation in settingsType.GetProperties())
                    {
                        try
                        {
                            //在这里对DenyReflectionAttrubite特性的属性跳过处理
                            if (propertyInformation.GetCustomAttributes(typeof(DenyReflectionAttrubite), false).Length > 0) continue;  
                            object propertyValue = propertyInformation.GetValue(member, null);
                            string valueAsString = propertyValue.ToString();
                            if (propertyValue.Equals(null))
                            {
                                valueAsString = String.Empty;
                            }
                            if (propertyValue.Equals(Int32.MinValue))
                            {
                                valueAsString = String.Empty;
                            }
                            if (propertyValue.Equals(Single.MinValue))
                            {
                                valueAsString = String.Empty;
                            }
                            jsonWriter.WritePropertyName(propertyInformation.Name.ToLower());
                            jsonWriter.WriteValue(valueAsString.Trim());
                        }
                        catch { }

                    }

                    jsonWriter.WriteEndObject();
                    jsonWriter.WriteEnd();
                    jsonWriter.WriteEndObject();
                }
            }

    这样就OK了。

  • 相关阅读:
    [Effective C++ --009]确定对象被使用前已先被初始化
    [Effective C++ --008]别让异常逃离析构函数
    [Effective C++ --007]为多态基类声明virtual析构函数
    [Effective C++ --006]若不能使用编译器自动生成的函数,就该明确拒绝
    [Effective C++ --005]了解C++默默编写并调用哪些函数
    [000]socket通信--server和client实现的简单例子
    [014]模板-模板实参推导
    [013]模板-非类型模板参数
    [012]泛型--lambda表达式捕获
    U3d keyCode值对应的按键
  • 原文地址:https://www.cnblogs.com/luluping/p/1435405.html
Copyright © 2011-2022 走看看