Attribut wird hier verwendet, um Json-Strings in C#-Objekte zu konvertieren. Aufgrund funktionaler Einschränkungen ist diese Version nur für Json-Strings wie „response“: „Hello“, „id“:21231513, „result“:100, „msg“: „OK“ und nicht für Json-Arrays geeignet. Das Atrribute wirkt hier auf das Attribut. Es verwendet zur Laufzeit Reflektion, um zu ermitteln, welchem Schlüssel im Json-String dieses Attribut entspricht.
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; } } } }
Der nächste Schritt ist diese Konvertierung Das Tool zerlegt und analysiert hauptsächlich den Schlüssel und den Wert in der JSON-Zeichenfolge und erhält und weist jedes entsprechende Attribut im Objekt durch Reflexion zu.
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 }); } } }
Schließlich ist dies der Code zum Testen
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); } }
Weitere benutzerdefinierte Methoden zum Konvertieren von Json-Strings in C#-Objekte finden Sie auf der chinesischen PHP-Website Artikel!