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了。

  • 相关阅读:
    时间复杂度计算
    SQL Server2012编程入门经典(第四版) 读书笔记
    一些编程试题
    Qt 对话框显示控制按钮
    vc++创建文件目录
    配置ubuntu虚拟机备忘
    Qt QThread 多线程使用
    Qt 程序等待多长时间执行Sleep
    Qt 数字和字符处理总结
    c++ 文件utf-8格式
  • 原文地址:https://www.cnblogs.com/luluping/p/1435405.html
Copyright © 2011-2022 走看看