v9.0.2016.0413 去掉模型解析器自动修正表名字段名的功能
|
# 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/dev/Doc/binary-¶þ½øÖÆÐòÁл¯Binary.md)
- [XML ÐòÁл¯](/NewLife/X/Blob/dev/Doc/xml-XMLÐòÁл¯Xml.md)
- [ÅäÖÃϵͳ Config](/NewLife/X/Blob/dev/Doc/config-ÅäÖÃϵͳConfig.md)
|