C#超精简的Json工具
自制了一个C#使用的Json工具类,没有什么奇奇怪怪的引用库,.Net4.0以上可直接运行,适合对json解析有需求但又不需要很重视的项目使用
话不多说,直接上代码
1 using System.Collections.Generic; 2 using System.Web.Script.Serialization; 3 public class JsonHelper 4 { 5 public static string Serialize<T>(T t) 6 { 7 JavaScriptSerializer js = new JavaScriptSerializer(); 8 return js.Serialize(t); 9 } 10 public static T Deserialize<T>(string Json) 11 { 12 JavaScriptSerializer js = new JavaScriptSerializer(); 13 return js.Deserialize<T>(Json); 14 } 15 public static JsonBuilder CreateJsonObjectBuilder() 16 { 17 JsonBuilder builder = new JsonBuilder(); 18 return builder; 19 } 20 public static JsonBuilder CreateJsonArrayBuilder() 21 { 22 JsonBuilder builder = new JsonBuilder(); 23 return builder.ToArray(); 24 } 25 } 26 public class JsonBuilder 27 { 28 private JsonBuilder jsonBuilder; 29 private Dictionary<string, object> JsonObject; 30 private List<Dictionary<string, object>> JsonArray; 31 32 public JsonBuilder() 33 { 34 jsonBuilder = this; 35 JsonObject = new Dictionary<string, object>(); 36 } 37 public JsonBuilder ToObject() 38 { 39 if (JsonArray != null && JsonArray.Count > 0) 40 { 41 JsonObject = JsonArray[0]; 42 } 43 else 44 { 45 JsonArray = null; 46 JsonObject = new Dictionary<string, object>(); 47 } 48 return jsonBuilder; 49 } 50 public JsonBuilder ToArray() 51 { 52 JsonArray = new List<Dictionary<string, object>>(); 53 if (JsonObject.Count > 0) 54 JsonArray.Add(JsonObject); 55 return jsonBuilder; 56 } 57 public bool IsArray() 58 { 59 return JsonArray != null; 60 } 61 public JsonBuilder SetProperty(string name, object value) 62 { 63 if (IsArray()) 64 return jsonBuilder; 65 if (typeof(JsonBuilder) == value.GetType()) 66 { 67 JsonBuilder JsonValue = value as JsonBuilder; 68 if (JsonValue.IsArray()) 69 value = JsonValue.JsonArray; 70 else 71 value = JsonValue.JsonObject; 72 } 73 //jsonBuilder = (IDictionary<string, object>)jsonBuilder; 74 if (JsonObject.ContainsKey(name)) 75 { 76 JsonObject[name] = value; 77 } 78 else 79 { 80 JsonObject.Add(name, value); 81 } 82 83 return jsonBuilder; 84 85 } 86 public JsonBuilder RemoveProperty(string name) 87 { 88 if (IsArray()) 89 return jsonBuilder; 90 if (JsonObject.ContainsKey(name)) 91 { 92 JsonObject.Remove(name); 93 } 94 return jsonBuilder; 95 } 96 public JsonBuilder AddItem(JsonBuilder jb) 97 { 98 if (!IsArray()) 99 return jsonBuilder; 100 if (jb.IsArray()) 101 JsonArray.AddRange(jb.JsonArray); 102 else 103 JsonArray.Add(jb.JsonObject); 104 return jsonBuilder; 105 } 106 public JsonBuilder RemoveItem(JsonBuilder jb) 107 { 108 if (!IsArray()) 109 return jsonBuilder; 110 if (jb.IsArray()) 111 { 112 foreach (var deleItem in jb.JsonArray) 113 { 114 if (JsonArray.Contains(deleItem)) 115 JsonArray.Remove(deleItem); 116 } 117 } 118 else 119 { 120 if (JsonArray.Contains(jb.JsonObject)) 121 JsonArray.Remove(jb.JsonObject); 122 } 123 return jsonBuilder; 124 } 125 public string ToJson() 126 { 127 object ToSerialize; 128 if (IsArray()) 129 ToSerialize = jsonBuilder.JsonArray; 130 else 131 ToSerialize = jsonBuilder.JsonObject; 132 return JsonHelper.Serialize<dynamic>(ToSerialize); 133 } 134 }
下面是测试,受Unity中DoTween动画插件的启发,设计了这种链式开火车的API,用起来可是十分优雅
1 JsonBuilder json = JsonHelper.CreateJsonObjectBuilder(); 2 JsonBuilder array = JsonHelper.CreateJsonArrayBuilder(); 3 array.AddItem(new JsonBuilder().SetProperty("item1","item1__value")); 4 array.AddItem(new JsonBuilder().SetProperty("item2","item2__value")); 5 json = json.SetProperty("name", "Zack").SetProperty("blog","cnblogs").SetProperty("obj", (new JsonBuilder().SetProperty("value", 1000))).SetProperty("array", array); 6 Console.WriteLine(json.ToJson()); 7 Console.ReadLine();
结果:
{"name":"Zack","blog":"cnblogs","obj":{"value":1000},"array":[{"item1":"item1__value"},{"item2":"item2__value"}]}
当然咯,以上工具类只是我个人用的,还没有在正式项目中验证过,若有什么错误的地方欢迎指正
以上。