自訂實現Json字串向C#對象轉變的方法

來源:互聯網
上載者:User

這裡使用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);
}
}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.