C# Json序列化的常用几种方式
除了使用实体类解析JSON,还有几种更便捷的方式,具体取决于你的需求和项目环境。以下是几种常见的方法:
例如我要解析这串json字符串:
{
"status": true,
"code": "200",
"message": "登陆成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
"userName": "超级管理员",
"img": "Upload/Tables/Sys_User/202504130014502760/2.png"
}
}
常用写法:
要将给定的JSON数据转换为C#实体类,可以按照以下步骤进行:
- 创建一个表示整个响应的类。
- 创建一个表示data字段内容的嵌套类。
以下是转换后的C#实体类代码:
public class LoginResponse
{
public bool Status { get; set; }
public string Code { get; set; }
public string Message { get; set; }
public Data Data { get; set; }
}
public class Data
{
public string Token { get; set; }
public string UserName { get; set; }
public string Img { get; set; }
}
将JSON数据反序列化为LoginResponse对象。例如,使用Newtonsoft.Json库进行反序列化:
using Newtonsoft.Json;
string json = @"{
""status"": true,
""code"": ""310"",
""message"": ""登陆成功"",
""data"": {
""token"": ""eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"",
""userName"": ""超级管理员"",
""img"": ""Upload/Tables/Sys_User/202204130014502760/2.png""
}
}";
LoginResponse response = JsonConvert.DeserializeObject<LoginResponse>(json);
1. 使用匿名类型
如果你只需要访问JSON中的某些字段,并且不想定义完整的实体类,可以使用匿名类型。这种方法适用于临时或一次性解析。
using Newtonsoft.Json.Linq;
string json = @"{
""status"": true,
""code"": ""310"",
""message"": ""登陆成功"",
""data"": {
""token"": ""eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"",
""userName"": ""超级管理员"",
""img"": ""Upload/Tables/Sys_User/202204130014502760/2.png""
}
}";
dynamic response = JObject.Parse(json);
bool status = response.status;
string code = response.code;
string message = response.message;
string token = response.data.token;
string userName = response.data.userName;
string img = response.data.img;
2. 使用 ExpandoObject
ExpandoObject 是一个动态对象,可以让你在运行时添加属性。
using Newtonsoft.Json;
string json = @"{
""status"": true,
""code"": ""310"",
""message"": ""登陆成功"",
""data"": {
""token"": ""eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"",
""userName"": ""超级管理员"",
""img"": ""Upload/Tables/Sys_User/202204130014502760/2.png""
}
}";
dynamic response = JsonConvert.DeserializeObject<ExpandoObject>(json);
bool status = response.status;
string code = response.code;
string message = response.message;
string token = response.data.token;
string userName = response.data.userName;
string img = response.data.img;
3. 使用 Dictionary<string, object>
如果你需要更灵活地处理JSON数据,可以将其反序列化为字典。
using Newtonsoft.Json;
string json = @"{
""status"": true,
""code"": ""310"",
""message"": ""登陆成功"",
""data"": {
""token"": ""eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"",
""userName"": ""超级管理员"",
""img"": ""Upload/Tables/Sys_User/202204130014502760/2.png""
}
}";
var response = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
bool status = (bool)response["status"];
string code = (string)response["code"];
string message = (string)response["message"];
var data = (Dictionary<string, object>)response["data"];
string token = (string)data["token"];
string userName = (string)data["userName"];
string img = (string)data["img"];
4. 使用 JsonDocument (System.Text.Json)
如果你使用的是 .NET Core 3.0 或更高版本,可以使用 System.Text.Json 命名空间中的 JsonDocument 类。
using System.Text.Json;
string json = @"{
""status"": true,
""code"": ""310"",
""message"": ""登陆成功"",
""data"": {
""token"": ""eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"",
""userName"": ""超级管理员"",
""img"": ""Upload/Tables/Sys_User/202204130014502760/2.png""
}
}";
using JsonDocument doc = JsonDocument.Parse(json);
JsonElement root = doc.RootElement;
bool status = root.GetProperty("status").GetBoolean();
string code = root.GetProperty("code").GetString();
string message = root.GetProperty("message").GetString();
JsonElement data = root.GetProperty("data");
string token = data.GetProperty("token").GetString();
string userName = data.GetProperty("userName").GetString();
string img = data.GetProperty("img").GetString();
这些方法各有优缺点,选择哪种方法取决于你的具体需求和项目的复杂性。如果你需要强类型检查和编译时安全性,使用实体类是最合适的选择。如果你需要灵活性和快速开发,匿名类型或 ExpandoObject 可能更适合。