很多情况下,我们需要把数据类型做一些转换,供其它外部的子系统调用。
最为典型的是生成json格式供javascript作调用。
现成的组件Newtonsoft.Json可以实现object2json之间的转换。
Newtonsoft.Json.JavaScriptConvert.SerializeObject(object)可以执行json的序列化,也是反序列化的方法。
常见的场景:
A系统提供用户资料(MemberInfo)给子系统B调用,但用户资料中有些内容是不能公开的,如Email地址。
本文由网页教学网()发布!转载和采集的话请不要去掉!谢谢。
直接用Newtonsoft.Json.JavaScriptConvert.SerializeObject好像是不行的,它会把object中的所有属性列出。
我的做法是这样的:
定义一个特性类,该特性类只允许用于类的属性上
viewplaincopytoclipboardprint?
[AttributeUsage(AttributeTargets.Property)]
publicclassDenyReflectionAttrubite:Attribute
{
publicDenyReflectionAttrubite(){}
}
[AttributeUsage(AttributeTargets.Property)]
publicclassDenyReflectionAttrubite:Attribute
{
publicDenyReflectionAttrubite(){}
}
MemberInfo类
viewplaincopytoclipboardprint?
publicclassMemberInfo
{
publicintUid
{
get;
set;
}
publicstringUserName
{
get;
set;
}
publicstringNickName
{
get;
set;
}
[DenyReflectionAttrubite]
publicstringPassword
{
get;
set;
}
[DenyReflectionAttrubite]
publicstringEmail
{
get;
set;
}
//.......................
}
publicclassMemberInfo
{
publicintUid
{
get;
set;
}
publicstringUserName
{
get;
set;
}
publicstringNickName
{
get;
set;
}
[DenyReflectionAttrubite]
publicstringPassword
{
get;
set;
}
[DenyReflectionAttrubite]
publicstringEmail
{
get;
set;
}
//.......................
}
至于DenyReflectionAttrubite特性如何使用,下面就会提出。
json生成
viewplaincopytoclipboardprint?
publicvoidBuilder()
{
using(jsonWriter=newJsonTextWriter(sw))
{
jsonWriter.Formatting=Formatting.None;
jsonWriter.Indentation=4;
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName("member");
jsonWriter.WriteStartArray();
jsonWriter.WriteStartObject();
TypesettingsType=this.member.GetType();
foreach(PropertyInfopropertyInformationinsettingsType.GetProperties())
{
try
{
//在这里对DenyReflectionAttrubite特性的属性跳过处理
if(propertyInformation.GetCustomAttributes(typeof(DenyReflectionAttrubite),false).Length>0)continue;
objectpropertyValue=propertyInformation.GetValue(member,null);
stringvalueAsString=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();
}
}
publicvoidBuilder()
{
using(jsonWriter=newJsonTextWriter(sw))
{
jsonWriter.Formatting=Formatting.None;
jsonWriter.Indentation=4;
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName("member");
jsonWriter.WriteStartArray();
jsonWriter.WriteStartObject();
TypesettingsType=this.member.GetType();
foreach(PropertyInfopropertyInformationinsettingsType.GetProperties())
{
try
{
//在这里对DenyReflectionAttrubite特性的属性跳过处理
if(propertyInformation.GetCustomAttributes(typeof(DenyReflectionAttrubite),false).Length>0)continue;
objectpropertyValue=propertyInformation.GetValue(member,null);
stringvalueAsString=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了。
点这里查看更多.NET教程