在C#中使用JSON

目录

介绍

背景

获取新的JSON库

兴趣点

编写和读取JSON文件

通过JsonSerializerOptions进行序列化设置

使用属性自定义序列化


在本文中,我向您展示JSON的基本操作。这是学习C#的关键主题之一。

介绍

如今,JSON已成为代表复杂结构和数据交换的主要格式之一。因此,所有主要的编程语言都具有使用它的内置支持。C#也不例外。在本文中,我想向您介绍一种在C/.NET中使用JSON文件的简单方法。我想向您展示这种格式的简单示例。

背景

至少有两种主要方法将.NET对象转换为JSON

  • 使用DataContractJsonSerializer
  • 使用JsonSerializer

让我们看看JsonSerializer类。此类允许您将对象序列化为JSON,反之,则可以将JSON代码反序列化为C#对象。

为了将对象保存为JSONJsonSerializer类定义了一个名为Serialize()static方法,该方法具有许多重载。他们之中有一些是:

string Serialize <T> (T obj, JsonSerializerOptions options)

 

类型化版本会序列化T类型的obj对象,并以string形式返回JSON代码。

 

string Serialize (Object obj, Type type, JsonSerializerOptions options)

 

序列化objtype type并将JSON代码返回为string。最后一个可选参数options允许您指定其他序列化选项。

 

Task SerializeAsync (Object obj, Type type, JsonSerializerOptions options)

 

序列化objtype type并将JSON代码返回为string。最后一个可选参数options允许您指定其他序列化选项。

 

Task SerializeAsync <T> (T obj, JsonSerializerOptions options)

 

类型化版本会序列化T类型的obj object,并以string形式返回JSON代码。

 

object Deserialize (string json, Type type, JsonSerializerOptions options)

 

JSON string反序列化为type typeobject,然后返回反序列化的对象。最后一个可选参数options允许您指定其他反序列化选项。

 

T Deserialize <T> (string json, JsonSerializerOptions options)

 

json string反序列化为类型Tobject并返回。

 

ValueTask <object> DeserializeAsync 
(Stream utf8Json, Type type, JsonSerializerOptions options, CancellationToken token)

 

将表示JSON对象的UTF-8文本反序列化为type typeobject。最后两个参数是可选的:options允许您设置其他反序列化选项,而token设置CancellationToken以取消任务。返回object包装在ValueTask中的反序列化。

 

ValueTask <T> DeserializeAsync <T> 
(Stream utf8Json, JsonSerializerOptions options, CancellationToken token)

 

将表示JSON objectUTF-8文本反序列化为一个type Tobject。返回object包装在ValueTask中的反序列化。

获取新的JSON

  • 如果您以.NET Core为目标。安装最新版本的NET Core 这为您提供了新的JSON库和ASP.NET Core集成。
  • 如果您以.NET Standard.NET Framework为目标。安装System.Text.Json  NuGet软件包(确保包括预览并安装版本4.6.0-preview6.19303.8或更高版本)。为了与ASP.NET Core集成,必须以.NET Core 3.0为目标。

兴趣点

让我们通过一个简单的示例来考虑使用该类。序列化和反序列化最简单的object

class Cellphone
    {
        public string Name { get; set; }
        public float Price { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Cellphone cellphone1 = new Cellphone { Name = "Iphone 12", Price = 750.00f };
            string json = JsonSerializer.Serialize<Cellphone>(cellphone1);
            Console.WriteLine(json);
            Cellphone restoredcellphone = JsonSerializer.Deserialize<Cellphone>(json);
            Console.WriteLine(restoredcellphone.Name +" "+  
                              Convert.ToString( restoredcellphone.Price));
            Console.ReadLine();
        }

在本例中,我们使用类型Cellphoneobject,然后这个object通过JsonSerializer.Serialize()方法序列化。然后,我们使用JsonSerializer.Deserialize()方法从object中的JSON进行反序列化Cellphone类型。在图1中,我们得到结果:

1 – JsonSerializer.Serialize()JsonSerializer.Deserialize()方法的结果。

此外,对于序列化/反序列化,我们可以使用一种结构。

(带有public修饰符的)仅objectpublic属性可以进行序列化。

被反序列化的object必须有无参数的构造函数。例如,在上面的示例中,这是默认的构造函数,但是您也可以在类中显式定义类似的构造函数。

编写和读取JSON文件

我们可以创建一个JSON文件,因为SerializeAsyc/DeserializeAsync可以接受stream以保存和写入数据。让我们考虑一个实例。

class Cellphone
    {
        public string Name { get; set; }
        public float Price { get; set; }
    }
    class Program
    {
        static async Task Main(string[] args)
        {
            using (FileStream fs = new FileStream("cellphone.json", FileMode.OpenOrCreate))
            {
                Cellphone cellphone1 = new Cellphone { Name = "Iphone 12", Price = 750.00f };
                await JsonSerializer.SerializeAsync<Cellphone>(fs, cellphone1);
                Console.WriteLine("We are done.File has benn saved");
            }
            using (FileStream fs = new FileStream("cellphone.json", FileMode.OpenOrCreate))
            {
                Cellphone restoredcellphone1 = 
                          await JsonSerializer.DeserializeAsync<Cellphone>(fs);
                Console.WriteLine($"Name: {restoredcellphone1.Name}  
                                  Price: {restoredcellphone1.Price}");
            }

            Console.ReadLine();
        }
    }

在这里,我们使用using因为FileStream是不受控制的资源,并且Data已被读写。

通过JsonSerializerOptions进行序列化设置

默认情况下,将JsonSerializer序列化为object最小代码。使用诸如JsonSerializerOptions的附加软件包,您可以使用JsonSerializerOptions属性来自定义序列化/反序列化引擎。其某些属性如下所示:

  • IgnoreReadOnlyProperties:简单地设置只读属性是否被序列化
  • IgnoreNullValues:设置是否在json对象及其属性中序列化/反序列化为 null
  • WriteIndented:设置是否在json中添加空格(相对而言,为了美观)。如果设置正确,多余的空格
  • AllowTrailingCommas:是否在json的最后一个逗号后添加逗号的元素。如果等于true,则添加逗号

使用属性自定义序列化

默认情况下,所有public属性都已序列化。另外,在输出json对象中,所有属性名称都与C#对象的属性名称匹配。但是,使用JsonIgnoreJsonPropertyName属性。

JsonIgnore属性使您可以从序列化中排除特定属性。JsonPropertyName允许您覆盖原始属性名称。让我们考虑一个例子:

class Cellphone
{
    [JsonPropertyName("NameOfCellPhone")]
    public string Name { get; set; }
    [JsonIgnore]
    public float Price { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Cellphone cellphone1 = new Cellphone() { Name = "Iphone 12", Price = 750.00f };
        string json = JsonSerializer.Serialize<Cellphone>(cellphone1);
        Console.WriteLine(json);
        Cellphone restoredPerson = JsonSerializer.Deserialize<Cellphone>(json);
        Console.WriteLine($"CellPhone: {restoredPerson.Name}
                          Price: {restoredPerson.Price}");

        Console.ReadLine();
    }

结果在图像2上。

图片2-JsonIgnore的结果

在这种情况下,该Price属性将被忽略,并且将使用NameOfCellPhone别名作为该CellPhone属性。请注意,由于Priceproperty尚未序列化,因此在反序列化时会使用其默认值。

总之,JSON是表示复杂结构和数据交换的主要格式之一。此外,所有主要的编程语言都具有使用它的内置支持,C#也不例外。

https://www.codeproject.com/Tips/5295019/Working-With-JSON-In-Csharp

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#使用JSON数据和echarts结合可以分为两个部分,分别是数据处理和图表显示。 首先,你可以使用C#的Newtonsoft.Json库来处理JSON数据。该库提供了丰富的API,可以方便地将JSON数据转换为C#的对象。例如,你可以使用JsonConvert.DeserializeObject()方法将JSON字符串转换为对象,或者使用JsonConvert.SerializeObject()方法将对象序列化为JSON字符串。 接下来,你可以将处理好的数据传递给前端页面,使用JavaScript的echarts库来展示数据。在前端页面,你可以使用ajax请求获取C#处理好的JSON数据,然后使用echarts提供的API来渲染图表。例如,你可以使用echarts的option配置项来设置图表类型、数据和样式等。 下面是一个简单的示例代码,演示了如何在C#处理JSON数据,并在前端页面使用echarts展示数据: 1. C#代码: ``` using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace EChartsDemo.Controllers { public class HomeController : Controller { public ActionResult Index() { // 模拟数据 List<DataItem> data = new List<DataItem>(); data.Add(new DataItem("类别A", 10)); data.Add(new DataItem("类别B", 20)); data.Add(new DataItem("类别C", 30)); // 将数据转换为JSON字符串 string jsonData = JsonConvert.SerializeObject(data); // 将JSON数据传递给前端页面 ViewBag.JsonData = jsonData; return View(); } } // 数据模型 public class DataItem { public string Name { get; set; } public int Value { get; set; } public DataItem(string name, int value) { this.Name = name; this.Value = value; } } } ``` 2. 前端页面代码: ``` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ECharts Demo</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/4.7.0/echarts.min.js"></script> </head> <body> <div id="chart" style="width: 600px;height:400px;"></div> <script type="text/javascript"> // 获取C#传递的JSON数据 var jsonData = '@Html.Raw(ViewBag.JsonData)'; // 将JSON字符串解析为JavaScript对象 var data = JSON.parse(jsonData); // 创建图表 var chart = echarts.init(document.getElementById('chart')); var option = { title: { text: '柱状图' }, tooltip: {}, xAxis: { data: data.map(function (item) { return item.Name; }) }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: data.map(function (item) { return item.Value; }) }] }; chart.setOption(option); </script> </body> </html> ``` 希望这个示例能够帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值