手机
当前位置:查字典教程网 >编程开发 >C#教程 >自定义实现Json字符串向C#对象转变的方法
自定义实现Json字符串向C#对象转变的方法
摘要:这里使用Atrribute的方式实现了Json字符串向C#对象的转变。因为功能局限,此版本只是针对于Json字符串,如"response":...

这里使用Atrribute的方式实现了Json字符串向C#对象的转变。因为功能局限,此版本只是针对于Json字符串,如"response":"Hello","id":21231513,"result":100,"msg":"OK."; 而不是Json数组。这里的Atrribute是作用在属性上,像NHibernate中的Atrribute一样,是在运行时通过反射来获取这个属性对应于Json字符串中的哪个key.

复制代码 代码如下:

namespace JsonMapper

{

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]

public class JsonFieldAttribute : Attribute

{

private string _Name = string.Empty;

public string Name

{

get { return _Name; }

set { _Name = value; }

}

}

}

接下来是这个转换工具中的核心代码,主要是分解并且分析Json字符串中key与value, 并且通过反射获得对象中的各个对应属性并且赋值。

复制代码 代码如下:

namespace JsonMapper

{

public class JsonToInstance

{

public T ToInstance<T>(string json) where T : new()

{

Dictionary<string, string> dic = new Dictionary<string, string>();

string[] fields = json.Split(',');

for (int i = 0; i < fields.Length; i++ )

{

string[] keyvalue = fields[i].Split(':');

dic.Add(Filter(keyvalue[0]), Filter(keyvalue[1]));

}

PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

T entity = new T();

foreach (PropertyInfo property in properties)

{

object[] propertyAttrs = property.GetCustomAttributes(false);

for (int i = 0; i < propertyAttrs.Length; i++)

{

object propertyAttr = propertyAttrs[i];

if (propertyAttr is JsonFieldAttribute)

{

JsonFieldAttribute jsonFieldAttribute = propertyAttr as JsonFieldAttribute;

foreach (KeyValuePair<string ,string> item in dic)

{

if (item.Key == jsonFieldAttribute.Name)

{

Type t = property.PropertyType;

property.SetValue(entity, ToType(t, item.Value), null);

break;

}

}

}

}

}

return entity;

}

private string Filter(string str)

{

if (!(str.StartsWith(""") && str.EndsWith(""")))

{

return str;

}

else

{

return str.Substring(1, str.Length - 2);

}

}

public object ToType(Type type, string value)

{

if (type == typeof(string))

{

return value;

}

MethodInfo parseMethod = null;

foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static

| BindingFlags.Public))

{

if (mi.Name == "Parse" && mi.GetParameters().Length == 1)

{

parseMethod = mi;

break;

}

}

if (parseMethod == null)

{

throw new ArgumentException(string.Format(

"Type: {0} has not Parse static method!", type));

}

return parseMethod.Invoke(null, new object[] { value });

}

}

}

最后这是用于测试的代码

复制代码 代码如下:

public class Message

{

//{ "result": 100, "response": "Who are you?!", "id": 13185569, "msg": "OK." }

[JsonField(Name = "result")]

public int Result { get; set; }

[JsonField(Name = "response")]

public string Response { get; set; }

[JsonField(Name = "id")]

public int Id { get; set; }

[JsonField(Name = "msg")]

public string Msg { get; set; }

}

复制代码 代码如下:

class Program

{

static void Main(string[] args)

{

JsonToInstance util = new JsonToInstance();

string json = ""response":"我是阿猫酱的小黄鸡","id":21231513,"result":100,"msg":"OK."";

Message m = util.ToInstance<Message>(json);

}

}

【自定义实现Json字符串向C#对象转变的方法】相关文章:

使用c#在word文档中创建表格的方法详解

c#完美截断字符串代码(中文+非中文)

共享锁using范围的实现方法

PowerShell 定时执行.Net(C#)程序的方法

c#中分割字符串的几种方法

C# 读取指定路径配置文件的方法

C# 透明窗体制作实现方法比较分析

C#图片压缩的实现方法

将字符串转换成System.Drawing.Color类型的方法

c# 重载WndProc,实现重写“最小化”的实现方法

精品推荐
分类导航