C#中对象与JSON字符串互相转换的三种方式

news/2024/4/29 4:50:42/文章来源:https://www.cnblogs.com/lgx5/p/16742947.html

JSON(JavaScriptObject Notation, JS 对象标记) 是一种轻量级的数据交换格式。

关于内存对象和JSON字符串的相互转换,在实际项目中应比较广泛,经过一番搜索,找到如下三种方法来解决此问题

分别是使用Newtonsoft.Json.dllDataContractJsonSerializerJavaScriptSerializer

方法一:Newtonsoft.Json.dll

添加Newtonsoft.json的引用

    class JsonNewtonsoft{/// <summary>/// 把对象转换为JSON字符串/// </summary>/// <param name="o">对象</param>/// <returns>JSON字符串</returns>public static string ToJSON(this object o){if (o == null){return null;}return JsonConvert.SerializeObject(o);}/// <summary>/// 把Json文本转为实体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="input"></param>/// <returns></returns>public static T FromJSON<T>(this string input){try{return JsonConvert.DeserializeObject<T>(input);}catch (Exception ex){return default(T);}}}

方法二:DataContractJsonSerializer

使用这种 需要引用System.Runtime.Serialization.dll

   class JsonDataContractJsonSerializer{/// <summary>/// 内存对象转换为json字符串/// </summary>/// <param name="obj"></param>/// <returns></returns>public static string ObjectToJson(object obj){DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());MemoryStream stream = new MemoryStream();serializer.WriteObject(stream, obj);byte[] dataBytes = new byte[stream.Length];stream.Position = 0;stream.Read(dataBytes, 0, (int)stream.Length);return Encoding.UTF8.GetString(dataBytes);}/// <summary>/// Json字符串转内存对象/// </summary>/// <param name="jsonString"></param>/// <param name="obj"></param>/// <returns></returns>public static object JsonToObject(string jsonString, object obj){DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());MemoryStream mStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));return serializer.ReadObject(mStream);}}

方法三:JavaScriptSerializer

需要引用:System.Web.Extensions.dll

    public static class JsonJavaScriptSerializer{/// <summary>/// 内存对象转换为json字符串/// </summary>/// <param name="obj"></param>/// <returns></returns>public static string ToJSON(object obj){StringBuilder sb = new StringBuilder();JavaScriptSerializer json = new JavaScriptSerializer();json.Serialize(obj, sb);return sb.ToString();}/// <summary>/// Json字符串转内存对象/// </summary>/// <param name="jsonString"></param>/// <param name="obj"></param>/// <returns></returns>public static T FromJSON<T>(string jsonString){JavaScriptSerializer json = new JavaScriptSerializer();return json.Deserialize<T>(jsonString);}}

程序测试:

新建一个测试对象类Student.cs

    public enum Sex{男=0,女=1}[Serializable()]class Student{private string _name;public string Name{get { return _name; }set { _name = value; }}private int _age;public int Age{get { return _age; }set { _age = value; }}private Sex _sex = Sex.男;public Sex Sex{get { return _sex; }set { _sex = value; }}public Student(){ }public Student(string name,int age,Sex sex){this._name = name;this._age = age;this._sex = sex;}}

测试程序

        static void Main(string[] args){Student st = new Student("笨男孩",22,Sex.男);Console.WriteLine("============方法一============================================");//方法一
Console.WriteLine("方法一对象转Json字符串");string jsonStr = JsonNewtonsoft.ToJSON(st);Console.WriteLine(jsonStr);Console.WriteLine("方法一Json字符串转对象");Student stobj = (Student)JsonNewtonsoft.FromJSON<Student>(jsonStr);Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}",stobj.Name,stobj.Age,stobj.Sex);Console.WriteLine("============方法二============================================");//方法二Console.WriteLine("方法二对象转Json字符串");string jsonStr2 = JsonDataContractJsonSerializer.ToJSON(st);Console.WriteLine(jsonStr2);Console.WriteLine("方法二Json字符串转对象");Student stobj2 = (Student)JsonDataContractJsonSerializer.FromJSON(jsonStr2, st);Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}", stobj2.Name, stobj2.Age, stobj2.Sex);Console.WriteLine("============方法三============================================");//方法二Console.WriteLine("方法三对象转Json字符串");string jsonStr3 = JsonJavaScriptSerializer.ToJSON(st);Console.WriteLine(jsonStr3);Console.WriteLine("方法三Json字符串转对象");Student stobj3 = (Student)JsonJavaScriptSerializer.FromJSON<Student>(jsonStr3);Console.WriteLine("姓名:{0} 年龄:{1} 性别:{2}", stobj3.Name, stobj3.Age, stobj3.Sex);Console.ReadKey();}

程序运行结果:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_16009.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【老板要你啥都会系列】| 前端晋升全栈--项目日志

目录 1.开篇 2.nodejs文件操作 3.stream 4.stream演示 5.写日志 6.拆分日志 7.分析日志介绍 8.readline 1.开篇 日志包含什么访问人数啊、峰值啊、bug 啊什么的&#xff0c;如果没有日志那么很容易失控。 访问日志可以参考我们 http-server&#xff0c;每次访问都会有这…

谐振波导光栅的严格分析

摘要 谐振波导光栅(RWG)由于其在波长、相位和偏振等方面的可调谐性&#xff0c;在研究和工业中有着广泛的应用。RWG的结构包含一个薄的高折射率波导薄膜&#xff0c;该薄膜与光栅接触。波导支持多种导模&#xff0c;并且根据厚度的不同&#xff0c;模式的数量也不同。在这个…

javaFx打包exe程序

文章目录将代码打成jar包准备工作下载exe4j定制jre检测jar包用到jre的哪些jmods生成jre准备exe图标使用exe4j将jar转换成exe程序将代码打成jar包 打jar之前&#xff0c;把那些用不到的依赖统统删除&#xff0c;以免包含一些无用的内容&#xff0c;比如用不上的一些依赖jar&…

特征工程之特征降维-特征选择-PCA/LDA

特征降维之特征选择 特征选择是建模中常用的降维手段&#xff0c;比较暴力&#xff0c;直接将不重要特征删除。 缺点&#xff1a;造成信息丢失&#xff0c;不利于模型精度。【与之形成对比的是PCA、LDA等降维方式。】 主要标准有两个&#xff1a; 特征是否发散。特征与目标的…

简单组件讲解

在编程阶段,会遇到有些页面的某一区域的布局或数据显示类似;那么我们就可以复用这一段代码;在使用原生JS编程时,我们习惯是将代码抽出来自成一个文件,需要时引入即可。而在vue中也存在这样一个模块,可以简便的将可复用的代码抽成一个模块,这个就是组件。在很多人看来,组…

产品-如何让用户“更愿意“付费

学院课程 文章目录学院课程前言如何提高用户体验,吸引用户付费关于程序员等级的划分基础免费试看优质博客内容转化为视频用户关于短视频内容的生成关于利用用户的碎片化时间怎么差异化竞品&#xff1f;短视频赛道理解学院现状分析总结前言 学院地址 今天下午公司组织了一场需求…

线性回归

线性回归 导入库 import numpy as np import pandas as pd import matplotlib.pyplot as plt人工数据集n = 100 true_theta = np.array([[1], [1]]) X = np.insert(np.random.normal(5, 1, size=(n, 1)), 0, 1, 1) y = X @ true_theta + np.random.normal(0, 0.04, size=(n, …

Azure | AZ-204 认证之旅-应用服务(二)

theme: orange 我正在参加「掘金启航计划」 Web应用是构建在PaaS层的服务&#xff0c;它是支持托管的&#xff0c;并且是可缩放的&#xff0c;极大提高了工程效率&#xff0c;并且减少了在运营的层面的消耗&#xff0c;这篇文章介绍如何创建应用程序服务。 创建Web应用程序服务…

pytorch深度学习训练模板(分类、回归)

前言 LeNet-AlexNet-ZFNet: LeNet-AlexNet-ZFNet一维复现pytorch VGG: VGG一维复现pytorch GoogLeNet: GoogLeNet一维复现pytorch ResNet: ResNet残差网络一维复现pytorch-含残差块复现思路分析 DenseNet: DenseNet一维复现pytorch 包含所有一维经典模型的代码可随意切换训练 …

云原生技术 --- k8s节点组件之kube-proxy的学习与理解

k8s 网络代理(kube-proxy)在每个节点上运行。网络代理反映了每个节点上 Kubernetes API 中定义的服务&#xff0c;并且可以执行简单的 TCP、UDP 和 SCTP 流转发&#xff0c;或者在一组后端进行 循环 TCP、UDP 和 SCTP 转发。但是&#xff0c;必须要有一个插件&#xff0c;才可以…

毕业设计- 基于单片机与GPS+GSM的车辆定位跟踪系统

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计Maduino Zero A9G GPRS/GPSk开发板这款低功耗A9G使用SIM800/900和NEO-6M GPS模块的基于Arduino的GPS跟踪系统5 软件说明使用Arduino的基于GPSGSM的车辆跟踪系统GPSGSM的车辆跟踪系统的代码6 最后0 前言 &#x1f525; 这两…

IDEA中使用Git

目录 一、IDEA中使用Git 配置Git settings ——>Version Control——>Git 点击Test测试版本号 下载gitee插件 配置账户 第一种方式&#xff1a;账号密码 第二种方式&#xff1a;通过Token令牌 分享单个项目 组员需要拿到项目的SSH地址 二、总结 一、IDEA中使用G…

万物互联时代到来,猿代码领衔先计算机赋数据化转型

社会经济的高速发展推动着各行各业进行转型升级&#xff0c;而数字经济则是当前社会经济发展的强大驱动。根据相关报道显示&#xff0c;早在多年前我国数字经济规模总量便达到万亿元规模&#xff0c;占2016年全年GDP比重的30&#xff05;。数字经济的飞速发张需要强劲算力的支撑…

wxpython设计GUI:grid控件实现显示表单数据功能,同时实现界面的上下翻页以及跳转功能

grid控件实现显示表单数据功能&#xff0c;同时实现界面的上下翻页以及跳转功能。 1. 效果展示 2. 代码实现 #!/usr/bin/env python # -*- coding: utf-8 -*- # Author: Logintern09########################################################################### ## Python …

【图像分割】基于matlab直方图的自适应阈值方法分割前景与背景【含Matlab源码 2144期】

一、一种基于直方图的实时自适应阈值分割方法简介 1 引言 在交通管理中&#xff0c;为了获得车辆的运动数据&#xff0c;需要对交通视频进行实时监测&#xff0c;从监测图像序列中检测出运动对象&#xff0c;并对运动对象进行分析处理&#xff0c;从而获得车辆和行人的运动数据…

EMQX Cloud 影子服务:便捷数据缓存服务,加速 IoT 应用开发

全托管 MQTT 消息云服务 EMQX Cloud 可以帮助用户轻松将各类物联网设备连接上云&#xff0c;提供与各类第三方服务的数据集成&#xff0c;助力用户进行高效的数据处理、存储与分析。 为了实现更加便捷的物联网数据处理&#xff0c;进一步简化用户构建物联网应用的开发流程&…

好心情精神心理科:抑郁症,真的会让你变丑!

有患者向好心情平台咨询&#xff1a;“抑郁症多年&#xff0c;我总感觉自己变丑了&#xff0c;脸色也不咋好看&#xff0c;这到底是我的心理作用&#xff0c;还是容貌真有变化呢&#xff1f;” 变丑这件事&#xff0c;不致命&#xff0c;但对于很多人来说&#xff0c;却似乎难…

net转java学习笔记-sqlserver的问题记录

最近公司有个.net项目&#xff0c;用的不是mysql是sqlserver&#xff0c;中间遇到几次问题记录下。 1.navicat连接sqlserver失败 百度了一下这个是缺少了驱动&#xff0c;其实navicat自带了这个驱动&#xff0c;没有安装而已。 打开Navicat的安装路径&#xff0c;Navicat自带s…

qsort:我很强,了解一下(详解过程)

了解qsort&#xff0c;以及模拟实现&#x1f391;情境引入&#x1f388;qsort&#x1f4d6;qsort的头文件&#x1f4c4;开场&#x1f511;qsort的参数&#x1f914;为什么可以对任意类型排序呢&#xff1f;&#x1f4dc;参数参数①参数②参数③最难的参数④&#x1f383;qsort应…

一个完全纯净的windows资源站

网址:https://hellowindows.cn/ hello Windows呢是一个纯净的Windows系统下载网站&#xff0c;从已经淘汰的xp到新推出的win11&#xff0c;大部分的系统版本都涵盖了 且都是中文版本,更加方便 windows server版本也包括在内哦