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

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 可能更适合。


http://www.kler.cn/a/562133.html

相关文章:

  • ros进阶——强化学习倒立摆的PG算法实现
  • 【Java项目】基于Spring Boot的教师人事档案管理系统
  • Dubbo RPC 原理
  • DeepSeek 助力 Vue 开发:打造丝滑的 复选框(Checkbox)
  • 什么是谷歌富媒体搜索
  • springboot博客系统详解与实现(后端实现)
  • DeepSeek点燃AI大模型战火:编程语言争霸,谁将问鼎“终极武器”王座?
  • axios几种请求类型的格式
  • 企业微信第三方应用开发025_企微通讯录组件使用04_vue中使用ww-open-data通讯录展示组件---企业微信开发027
  • 基于C++“简单且有效”的“数据库连接池”
  • 45.matlab产生正弦叠加信号
  • Spring Boot + Redis 实现分布式锁
  • 安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?
  • 飞书webhook监控业务系统端口
  • 基于全志T527+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案
  • [Web 信息收集] Web 信息收集 — 手动收集 IP 信息
  • Kubernetes 1.29升级至1.31版本笔记
  • 【Linux】Ubuntu服务器的安装和配置管理
  • pytest下放pytest.ini文件就导致报错:ERROR: file or directory not found: #
  • 开发一个交易所需要哪些技术?