当前位置: 首页 > news >正文

C# Json序列化的常用几种方式

除了使用实体类解析JSON,还有几种更便捷的方式,具体取决于你的需求和项目环境。以下是几种常见的方法:
例如我要解析这串json字符串:

{
  "status": true,
  "code": "200",
  "message": "登陆成功",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
    "userName": "超级管理员",
    "img": "Upload/Tables/Sys_User/202504130014502760/2.png"
  }
}

常用写法:

要将给定的JSON数据转换为C#实体类,可以按照以下步骤进行:

  1. 创建一个表示整个响应的类。
  2. 创建一个表示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 可能更适合。

相关文章:

  • 教你通过腾讯云AI代码助手,免费使用满血版deepseek r1,还可以自定义知识库!
  • AF3 pair_sequences函数解读
  • 2月27(信息差)
  • Spock框架:让单元测试更优雅的高效武器
  • 【nextjs官方demo】Chapter 6连接数据库报错
  • docker 运行claude 的computer use
  • Linux驱动学习(四)--字符设备注册
  • MySQL练习
  • AI人工智能机器学习之降维和数据压缩
  • 基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活
  • lvgl运行机制分析
  • 车载以太网-基于linux的ICMP协议
  • 决策树(Decision Tree)详细解释(带示例)
  • 精神分裂症患者GAF评分的可视化分析|使用集成学习模型 LightGBM
  • Linux操作系统:基于 Linux 的工业机器人项目设计与实现
  • 【uniapp】在UniApp中实现持久化存储:安卓--生成写入数据为jsontxt
  • python环境打包2 pytorch和cuda的安装逻辑
  • 鸿蒙兼容Mapbox地图应用测试
  • 解决npm run dev报错
  • STM32 微控制器库RCC_OscInitTypeDef结构参数介绍
  • 在郑州建设网站这么做/东莞网站建设推广哪家好
  • 深圳优化网站公司/如何看待百度竞价排名
  • 网页设计ppt演讲/seo黑帽技术工具
  • 网站做收录是什么意思/跨境电商平台
  • wordpress 免费企业主题/seo搜索方法
  • 苏州招聘网站制作/企业网站建设