C# 操作JSON几种方式盘点

2023-10-27

C# 操作JSON几种方式

通过两种在c#中常用的方式来实现对Json数据的序列化和反序列化,为了实现大多数的需求,我们采用稍微复杂一点的数据模型。

首先我们有以下json数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

{

  "name": "张三",

  "age": 20,

  "idCard": "123456789",

  "birthday": "2021-01-01 00:00:00",

  "hobbys": [

    {

      "sort": 1,

      "desc": "写字"

    },

    {

      "sort": 2,

      "desc": "游泳"

    }

  ]

}

然后我们根据json的结构创建一个实体类

1

2

3

4

5

6

7

8

9

10

11

12

13

private class Studet

{

    public string name { get; set; }

    public int age { get; set; }

    public string idCard { get; set; }

    public DateTime birthday { get; set; }

    public List<hobby> hobbys { get; set; }

}

private class hobby

{

    public int sort { get; set; }

    public string desc { get; set; }

}

第一种方式:JavaScriptSerializer

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//需添加引用:System.Web.Extensions

//需导入命名空间:using System.Web.Script.Serialization;

  

  

//json.txt中的数据为上面的json数据

string json = File.ReadAllText("d:\\json.txt");

  

  

JavaScriptSerializer jss = new JavaScriptSerializer();

//反序列化成Studet对象

Studet student = jss.Deserialize<Studet>(json);

//然后就可以直接用操作对象的方法直接点出来就行

//输出:张三

Console.WriteLine(student.name);

  

  

//同样的,我们可以将上面的对象序列化成一个json数据

//序列化成json

string resultJson = jss.Serialize(student);

Console.WriteLine(resultJson);

第二种方式:JSON.NET

1

2

3

4

5

6

7

8

9

10

11

12

13

//需添加引用:Newtonsoft.Json

//需导入命名空间:using Newtonsoft.Json; using Newtonsoft.Json.Linq;

  

  

 //反序列化成对象

Studet student = JsonConvert.DeserializeObject<Studet>(json);

//输出:张三

Console.WriteLine(student.name);

  

  

//序列化成json

string resultJson = JsonConvert.SerializeObject(student);

Console.WriteLine(resultJson);

以上是我们通过json结构映射实体类的方式去实现的解析json数据,很多时候我们可能并不需要,或者并不想创建太多的类,这时候我们可以通过以下方式去实现解析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//使用JObject(JSON.NET)

//反序列化成JObject

JObject jobj = JObject.Parse(json);

//输出:张三

Console.WriteLine(jobj["name"].ToString());

//解析hobbys

 JArray jarr = JArray.Parse(jobj["hobbys"].ToString());

//迭代jarr即可

  

  

//同样的,假如我们有一个JObject对象

 JObject obj = new JObject();

 obj["name"] = "张三";

 obj["age"] = 20;

 //输出json数据,直接ToString()就可以

 Console.WriteLine(obj.ToString());

如果说你的Json结构是一个数组形式的话,即[{},{},{}],我们可以通过以下方式去解析

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//第一种:DataTable

DataTable dt = JsonConvert.DeserializeObject<DataTable>(json);

//或者使用JavaScriptSerializer

dt =jss.Deserialize<DataTable>(json);

//解析DataTable即可

  

  

//第二种:JArray

JArray jarr = JArray.Parse(json);

//然后去迭代jarr即可

foreach (var j in jarr)

{

    Console.WriteLine(j["key"]);

}

  

  

//第三种,也就是我们上面提到了有实体类的情况下

List<Studet> list = JsonConvert.DeserializeObject<List<Studet>>(json);

以上基本可以解决我们的日常开发需求,个人推荐使用JSON.NET。

这些仅为个人经验,希望能给大家一个参考,希望可以帮到大家。

转自:微点阅读   https://www.weidianyuedu.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 操作JSON几种方式盘点 的相关文章

  • 更快的算法来计算有多少数字可以被范围内的特定整数整除

    int a b c d 0 cin gt gt a gt gt b gt gt c for int i a i lt b i if i c 0 d cout lt
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • BigQuery 如何获取 JSON 结构中的值的总和?

    我有以下查询 SELECT JSON EXTRACT json Weights as weight from select Weights blue 1 0 purple 0 0 yellow 1 0 green 1 0 as json 返
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 在运行时设置 DataGridView 上的 DataFormatString?

    是否可以在运行时设置 ASP NET DataGridView 中的列或单元格的 DataFormatString 属性 这应该有效 BoundField priceField grid Columns 0 as BoundField pr
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 展开路径中具有环境变量的文件名

    最好的扩张方式是什么 MyPath filename txt to home user filename txt or MyPath filename txt to c Documents and settings user filenam
  • 为什么C语言中可以使用多个分号?

    在 C 中我可以执行以下操作 int main printf HELLO WORLD 它有效 这是为什么 我个人的想法 分号是一个 NO OPERATION 来自维基百科 指示符 拥有一大串分号与拥有一个分号并告诉 C 语句已结束具有相同的
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • 关于新版Win10下安装虚拟机提示“Intel VT-x处于禁用状态”如何解决

    给电脑上安装虚拟机 安装的时候可能会遇到问题 提示 Intel VT x处于禁用状态 问题原因 出现这样的原因一般都是由于系统Virtualization Technology虚拟化技术功能 关闭导致的 解决方法 进入新版Win10的BIO
  • QT代码,重载函数d_func()声明形式分析和调用关系分析

    QT代码 重载函数d func 声明形式分析和调用关系分析 define X DECLARE PRIVATE Class inline Class Private d func return reinterpret cast
  • Linux uboot顶层makefile详解 一

    VERSION 2016 主版本号 PATCHLEVEL 03 补丁版本号 SUBLEVEL 次版本号 EXTRAVERSION 附加版本信息 NAME MAKEFLAGS rR include dir CURDIR rR 表示禁止使用内置
  • 快速复习一遍C++基础知识点

    暂定月计划 1实现DSA基础算法 2完成一个STL库 3在Linux上加强相关知识 4git巩固 5OJ增强代码实现能力 今天先快读复习一遍C 知识点 想把peral读完 1 引用 交换两个数示例 C语言中 void swap int a
  • Redis 学习笔记4: Redis 3.2.1 集群搭建

    在CenOS 6 7 linux环境下搭建Redis 集群环境 1 下载最新的Redis版本 本人下载的Redis版本是3 2 1版本 下载之后 解压 编译 make 具体操作可以参考我的博文 Redis 学习笔记1 CentOS 6 7下
  • 使用navicat需要安装mysql吗_[转载] windows安装mysql及使用navicat连接

    参考资料 1 https blog csdn net u013235478 article details 50623693 2 https blog csdn net qq 35436635 article details 8012602
  • 广告公司到底干什么的?欣奥诚分享

    广告公司到底干什么的 这篇文章从产业的角度拆分广告业 还原一个真实的广告业出来 01 它们是谁 早年广告业有4类公司 品牌咨询类公司 设计创意类公司 媒介投放类公司 活动执行类公司 品牌咨询类公司 靠咨询服务为主营业务 为广告主提供品牌战略
  • 七、dokcer-compose部署springboot的jar

    1 准备 打包后包名为 ruoyi admin jar 增加接口 httpL ip port common test han 环境变量预application yml 中REDIS HOSTt的值 去环境变量去找 如果找不到REDIS HO
  • 点云基本概念

    文章目录 一 三维数据的表现形式 二 点云的概念 三 点云的特点 四 点云的获取方式 激光雷达 结构光 立体视觉 TOF相机 一 三维数据的表现形式 三维数据的表现形式一般分为四种 分别是点云 网格 体素与多视图 点云是三维空间中点的集合
  • 【新书推荐】【2020】MATLAB深度学习工具箱用户指南

    Table of contents Deep Networks Deep Learning in MATLAB What Is Deep Learning Try Deep Learning in 10 Lines of MATLAB Co
  • 监控实践: 基于K8S部署Prometheus+Grafana

    使用Prometheus对系统进行监控 使用Grafana进行数据展示 我的环境是K8S 我的部署方式是通过 yaml文件进行部署 已经部署文件上传到了Github 地址 https github com zeyangli devops o
  • SpringMVC系列(三)之CRUD增删改查

    目录 SpringMVC实现增删改查 1 导入相关依赖 2 添加配置文件 3 逆向生成对应的类 4 后台代码编写 5 前台代码编写 SpringMVC实现增删改查 1 导入相关依赖 pom xml
  • WeakMap弱引用

    let obj name 张三 name 张三 这个对象能够被读取到 因为obj这个变量名对它的引用 将引用覆盖掉 obj null 这个对象将会被从内存中移除 因为我们已经失去了对他的所有引用 let obj name 张三 let ar
  • 打开计算机窗口的快捷键是什么,打开多个窗口,用哪个快捷键可以将窗口切换?...

    2006 02 23 上网的时候 一打开窗口就是最小化 怎样可以一打开就是最大化呢 谢谢 IE具有 自动记忆功能 它能保存上一次关闭窗口后的状态参数 IE本身没有提供相关设置选项 不过可以借助修改注册表来实现 打开 注册表编辑器 找到 HK
  • MRTK-Unity简单入门

    前期工作 1 切换生成平台 UWP 2 Microsoft Mixed Reality Feature Tool导入和配置资源 Mixed Reality Toolkit Foundation 混合现实工具包基础 包是唯一的包 必须将它导入
  • 【Android】详解7.0带来的新工具类:DiffUtil

    http blog csdn net zxt0601 article details 52562770 一 概述 DiffUtil是support v7 24 2 0中的新工具类 它用来比较两个数据集 寻找出旧数据集 新数据集的最小变化量
  • 快速排序Java实现

    public class ksSort 快排 param args public static void main String args int test 1 9 5 7 8 2 4 quickSort quick Sort test f
  • 前端:react(柒):react 多个组件共享state

    柒 react 多个组件共享state 经常会遇到几个组件需要共用状态数据的情况 这种情况下 我们最好将这部分共享的状态提升至他们最近的父组件当中进行管理 const scaleNames c Celsius f Fahrenheit fu
  • 为什么PCB设计时经常进行电源平面的内缩

    我们可以发现 有的PCB在GND层和电源层会进行一定程度的电源平面内缩设计 那么大家有没有想过为什么要内缩呢 需要搞清楚这个问题 我们需要来先了解一个知识点 那就是 20H 原则 20H原则主要是为了减小电路板电磁辐射问题提出来的 在电路板
  • C# 操作JSON几种方式盘点

    C 操作JSON几种方式 通过两种在c 中常用的方式来实现对Json数据的序列化和反序列化 为了实现大多数的需求 我们采用稍微复杂一点的数据模型 首先我们有以下json数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14