v9.0.2016.0413   去掉模型解析器自动修正表名字段名的功能
nnhy authored at 2016-04-13 14:42:30
8.25 KiB
X
# JSON ÐòÁл¯ ## ¸ÅÊö NewLife.Core ÌṩÁËÇáÁ¿¼¶µÄ JSON ÐòÁл¯ºÍ·´ÐòÁл¯¹¦ÄÜ£¬Í¨¹ý `JsonHelper` À©Õ¹·½·¨¿ÉÒÔ·½±ãµØ½øÐжÔÏóÓë JSON ×Ö·û´®µÄת»»¡£ÄÚÖà `FastJson` ʵÏÖ£¬Í¬Ê±Ö§³ÖÇл»µ½ `System.Text.Json`¡£ **ÃüÃû¿Õ¼ä**£º`NewLife.Serialization` **ÎĵµµØÖ·**£ºhttps://newlifex.com/core/json ## ºËÐÄÌØÐÔ - **ÇáÁ¿¼¶**£ºÄÚÖà `FastJson` ʵÏÖ£¬ÎÞÍⲿÒÀÀµ - **¸ßÐÔÄÜ**£ºÕë¶Ô³£¼û³¡¾°ÓÅ»¯£¬Ö§³Ö¶ÔÏó³Ø - **À©Õ¹·½·¨**£º`ToJson()` ºÍ `ToJsonEntity<T>()` ¼ò½àÒ×Óà - **ÅäÖÃÁé»î**£ºÖ§³ÖÍÕ·åÃüÃû¡¢ºöÂÔ¿ÕÖµ¡¢Ëõ½ø¸ñʽ»¯µÈ - **ÀàÐÍת»»**£º×Ô¶¯´¦Àí³£¼ûÀàÐÍת»» - **¿ÉÇл»**£ºÖ§³ÖÇл»µ½ `System.Text.Json` ʵÏÖ ## ¿ìËÙ¿ªÊ¼ ### ÐòÁл¯ ```csharp using NewLife.Serialization; // ¼òµ¥¶ÔÏóÐòÁл¯ var user = new { Id = 1, Name = "ÕÅÈý", Age = 25 }; var json = user.ToJson(); // {"Id":1,"Name":"ÕÅÈý","Age":25} // ¸ñʽ»¯Êä³ö var jsonIndented = user.ToJson(true); // { // "Id": 1, // "Name": "ÕÅÈý", // "Age": 25 // } // ÍÕ·åÃüÃû var jsonCamel = user.ToJson(false, true, true); // {"id":1,"name":"ÕÅÈý","age":25} ``` ### ·´ÐòÁл¯ ```csharp using NewLife.Serialization; var json = """{"Id":1,"Name":"ÕÅÈý","Age":25}"""; // ·´ÐòÁл¯ÎªÖ¸¶¨ÀàÐÍ var user = json.ToJsonEntity<User>(); // ·´ÐòÁл¯Îª¶¯Ì¬×Öµä var dict = json.DecodeJson(); var name = dict["Name"]; // "ÕÅÈý" ``` ## API ²Î¿¼ ### ToJson - ÐòÁл¯ ```csharp // »ù´¡ÐòÁл¯ public static String ToJson(this Object value, Boolean indented = false) // ÍêÕû²ÎÊý public static String ToJson(this Object value, Boolean indented, Boolean nullValue, Boolean camelCase) // ʹÓÃÅäÖöÔÏó public static String ToJson(this Object value, JsonOptions jsonOptions) ``` **²ÎÊý˵Ã÷**£º - `indented`£ºÊÇ·ñËõ½ø¸ñʽ»¯£¬Ä¬ÈÏ false - `nullValue`£ºÊÇ·ñÊä³ö¿ÕÖµ£¬Ä¬ÈÏ true - `camelCase`£ºÊÇ·ñʹÓÃÍÕ·åÃüÃû£¬Ä¬ÈÏ false **ʾÀý**£º ```csharp var obj = new { Id = 1, Name = "²âÊÔ", Description = (String?)null, CreateTime = DateTime.Now }; // ĬÈÏÊä³ö obj.ToJson(); // {"Id":1,"Name":"²âÊÔ","Description":null,"CreateTime":"2025-01-07 12:00:00"} // ºöÂÔ¿ÕÖµ obj.ToJson(false, false, false); // {"Id":1,"Name":"²âÊÔ","CreateTime":"2025-01-07 12:00:00"} // ÍÕ·åÃüÃû + ¸ñʽ»¯ obj.ToJson(true, true, true); ``` ### ToJsonEntity - ·´ÐòÁл¯ ```csharp // ·ºÐÍ·½·¨ public static T? ToJsonEntity<T>(this String json) // Ö¸¶¨ÀàÐÍ public static Object? ToJsonEntity(this String json, Type type) ``` **ʾÀý**£º ```csharp var json = """{"id":1,"name":"ÕÅÈý","roles":["admin","user"]}"""; // ·´ÐòÁл¯ÎªÀà public class User { public Int32 Id { get; set; } public String Name { get; set; } public String[] Roles { get; set; } } var user = json.ToJsonEntity<User>(); Console.WriteLine(user.Name); // ÕÅÈý Console.WriteLine(user.Roles[0]); // admin ``` ### DecodeJson - ½âÎöΪ×Öµä ```csharp public static IDictionary<String, Object?>? DecodeJson(this String json) ``` ½« JSON ×Ö·û´®½âÎöΪ×ֵ䣬ÊÊÓÃÓÚ¶¯Ì¬·ÃÎʳ¡¾°¡£ **ʾÀý**£º ```csharp var json = """{"code":0,"data":{"id":1,"name":"test"},"message":"ok"}"""; var dict = json.DecodeJson(); var code = dict["code"].ToInt(); // 0 var data = dict["data"] as IDictionary<String, Object>; var id = data["id"].ToInt(); // 1 ``` ### JsonOptions - ÅäÖÃÑ¡Ïî ```csharp public class JsonOptions { /// <summary>ʹÓÃÍÕ·åÃüÃû¡£Ä¬ÈÏfalse</summary> public Boolean CamelCase { get; set; } /// <summary>ºöÂÔ¿ÕÖµ¡£Ä¬ÈÏfalse</summary> public Boolean IgnoreNullValues { get; set; } /// <summary>ºöÂÔÑ­»·ÒýÓá£Ä¬ÈÏfalse</summary> public Boolean IgnoreCycles { get; set; } /// <summary>Ëõ½ø¸ñʽ»¯¡£Ä¬ÈÏfalse</summary> public Boolean WriteIndented { get; set; } /// <summary>ʹÓÃÍêÕûʱ¼ä¸ñʽ¡£Ä¬ÈÏfalse</summary> public Boolean FullTime { get; set; } /// <summary>ö¾ÙʹÓÃ×Ö·û´®¡£Ä¬ÈÏfalseʹÓÃÊý×Ö</summary> public Boolean EnumString { get; set; } /// <summary>³¤ÕûÐÍ×÷Ϊ×Ö·û´®¡£±ÜÃâJS¾«¶È¶ªÊ§£¬Ä¬ÈÏfalse</summary> public Boolean Int64AsString { get; set; } } ``` **ʾÀý**£º ```csharp var options = new JsonOptions { CamelCase = true, IgnoreNullValues = true, WriteIndented = true, EnumString = true }; var json = obj.ToJson(options); ``` ### Format - ¸ñʽ»¯ JSON ```csharp public static String Format(String json) ``` ½«Ñ¹ËõµÄ JSON ×Ö·û´®¸ñʽ»¯ÎªÒ×¶Á¸ñʽ¡£ **ʾÀý**£º ```csharp var json = """{"id":1,"name":"test","items":[1,2,3]}"""; var formatted = JsonHelper.Format(json); // { // "id": 1, // "name": "test", // "items": [ // 1, // 2, // 3 // ] // } ``` ## IJsonHost ½Ó¿Ú `IJsonHost` ÊÇ JSON ÐòÁл¯µÄºËÐĽӿڣ¬¿ÉÒÔÇл»²»Í¬µÄʵÏÖ£º ```csharp public interface IJsonHost { IServiceProvider ServiceProvider { get; set; } JsonOptions Options { get; set; } String Write(Object value, Boolean indented = false, Boolean nullValue = true, Boolean camelCase = false); String Write(Object value, JsonOptions jsonOptions); Object? Read(String json, Type type); Object? Convert(Object obj, Type targetType); Object? Parse(String json); IDictionary<String, Object?>? Decode(String json); } ``` ### Çл»ÊµÏÖ ```csharp // ĬÈÏʹÓà FastJson JsonHelper.Default = new FastJson(); // Çл»µ½ System.Text.Json£¨.NET 5+£© JsonHelper.Default = new SystemJson(); ``` ## ʹÓó¡¾° ### 1. Web API Êý¾Ý½»»» ```csharp // ÐòÁл¯ÏìÓ¦ public class ApiResult<T> { public Int32 Code { get; set; } public String? Message { get; set; } public T? Data { get; set; } } var result = new ApiResult<User> { Code = 0, Message = "success", Data = new User { Id = 1, Name = "test" } }; // ʹÓÃÍÕ·åÃüÃû£¨Ç°¶ËÓѺã© var json = result.ToJson(false, true, true); // ½âÎöÏìÓ¦ var response = json.ToJsonEntity<ApiResult<User>>(); ``` ### 2. ÅäÖÃÎļþ´¦Àí ```csharp // ¶ÁÈ¡ JSON ÅäÖà var json = File.ReadAllText("config.json"); var config = json.ToJsonEntity<AppConfig>(); // ±£´æÅäÖà var newJson = config.ToJson(true); // ¸ñʽ»¯±ãÓÚÔĶÁ File.WriteAllText("config.json", newJson); ``` ### 3. ÈÕÖ¾¼Ç¼ ```csharp public void LogRequest(Object request) { // ÐòÁл¯ÇëÇó²ÎÊýÓÃÓÚÈÕÖ¾ var json = request.ToJson(); XTrace.WriteLine($"Request: {json}"); } ``` ### 4. ¶¯Ì¬Êý¾Ý´¦Àí ```csharp // ´¦Àí²»È·¶¨½á¹¹µÄ JSON var json = await httpClient.GetStringAsync(url); var dict = json.DecodeJson(); if (dict.TryGetValue("error", out var error)) { throw new Exception(error?.ToString()); } var data = dict["data"] as IDictionary<String, Object>; // ¶¯Ì¬·ÃÎÊ×Ö¶Î... ``` ### 5. ´¦Àí³¤ÕûÐ;«¶ÈÎÊÌâ ```csharp // JavaScript ÎÞ·¨¾«È·±íʾ³¬¹ý 2^53 µÄÕûÊý var options = new JsonOptions { Int64AsString = true }; var obj = new { Id = 9007199254740993L }; var json = obj.ToJson(options); // {"Id":"9007199254740993"} // ×Ö·û´®ÐÎʽ£¬±ÜÃ⾫¶È¶ªÊ§ ``` ## ÌØÊâÀàÐÍ´¦Àí ### ÈÕÆÚʱ¼ä ```csharp var obj = new { Time = DateTime.Now }; // ĬÈϸñʽ obj.ToJson(); // {"Time":"2025-01-07 12:00:00"} // ÍêÕû ISO ¸ñʽ var options = new JsonOptions { FullTime = true }; obj.ToJson(options); // {"Time":"2025-01-07T12:00:00.0000000+08:00"} ``` ### ö¾Ù ```csharp public enum Status { Pending, Active, Closed } var obj = new { Status = Status.Active }; // ĬÈÏʹÓÃÊý×Ö obj.ToJson(); // {"Status":1} // ʹÓÃ×Ö·û´® var options = new JsonOptions { EnumString = true }; obj.ToJson(options); // {"Status":"Active"} ``` ### ×Ö½ÚÊý×é ```csharp var obj = new { Data = new Byte[] { 1, 2, 3, 4 } }; // ĬÈÏ Base64 obj.ToJson(); // {"Data":"AQIDBA=="} ``` ## ×î¼Ñʵ¼ù ### 1. ¸´ÓÃÅäÖöÔÏó ```csharp // ¶¨ÒåÈ«¾ÖÅäÖà public static class JsonConfig { public static readonly JsonOptions Api = new() { CamelCase = true, IgnoreNullValues = true }; public static readonly JsonOptions Log = new() { WriteIndented = false, IgnoreNullValues = true }; } // ʹÓà var json = data.ToJson(JsonConfig.Api); ``` ### 2. ´¦Àí¿ÕÖµ ```csharp // ·´ÐòÁл¯Ê±×¢Òâ¿ÕÖµ var user = json.ToJsonEntity<User>(); if (user == null) { // JSON Ϊ null »ò½âÎöʧ°Ü } // »òʹÓÿÕ×Ö·û´®¼ì²é if (json.IsNullOrEmpty()) return; var user = json.ToJsonEntity<User>(); ``` ### 3. ´óÊý¾ÝÁ¿´¦Àí ```csharp // ¶ÔÓÚ´óÁ¿Êý¾Ý£¬¿¼ÂÇ·ÖÅú´¦Àí // ±ÜÃâÒ»´ÎÐÔÐòÁл¯/·´ÐòÁл¯³¬´ó¶ÔÏó ``` ## ÐÔÄÜ˵Ã÷ - `FastJson` Õë¶Ô³£¼û³¡¾°ÓÅ»¯£¬Êʺϴó¶àÊýÓ¦Óà - ¶ÔÓÚ¸ßÐÔÄÜÒªÇ󣬿ÉÇл»µ½ `System.Text.Json` - ±ÜÃâÆµ·±´´½¨ `JsonOptions`£¬½¨Ò鸴Óà - ×Ö·û´®²Ù×÷ʹÓöÔÏó³ØÓÅ»¯ ## Ïà¹ØÁ´½Ó - [¶þ½øÖÆÐòÁл¯ Binary](/NewLife/X/Blob/master/Doc/binary-¶þ½øÖÆÐòÁл¯Binary.md) - [XML ÐòÁл¯](/NewLife/X/Blob/master/Doc/xml-XMLÐòÁл¯Xml.md) - [ÅäÖÃϵͳ Config](/NewLife/X/Blob/master/Doc/config-ÅäÖÃϵͳConfig.md)