Attribute は、Json 文字列を C# オブジェクトに変換するためにここで使用されます。機能上の制限により、このバージョンは Json 配列ではなく、"response":"Hello","id":21231513,"result":100,"msg":"OK." などの Json 文字列のみを対象としています。ここでの Attribute は、NHibernate の Attribute と同様に、実行時にリフレクションを使用して、この属性が対応する Json 文字列のキーを取得します
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 文字列内のキーと値を取得し、リフレクションを通じてオブジェクト内の対応する各属性を取得して割り当てます。
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# オブジェクトに変換するさらにカスタマイズされた方法については、PHP 中国語 Web サイトの関連記事に注目してください。