时间:2021-05-19
这里使用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);
}
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例展示了C#自定义函数NetxtString实现生成随机字符串的方法,在进行C#项目开发中非常实用!分享给大家供大家参考。一、生成随机字符串关键代码如下:
本文实例讲述了C#自定义字符串替换Replace方法。分享给大家供大家参考。具体实现方法如下:一、问题:前一阵遇到一个如标题的算法题,是将原有字符串的某些片段替
本文实例讲述了C#格式化json字符串的方法。分享给大家供大家参考,具体如下:将Json字符串转化成格式化表示的方法:字符串反序列化为对象-->对象再序列化为字
本文实例讲述了C#自定义字符串压缩和解压缩的方法。分享给大家供大家参考。具体如下:classZipLib{publicstaticstringZip(strin
本文实例讲述了C#按字节数截取字符串并在后面加上省略号...的方法,这是一个自定义的C#函数,函数的使用说明如下:原始字符串提取前endIdex个字节函数代码如