C#实现json格式数据解析功能的方法详解

C#实现json格式数据解析功能的方法详解

什么是JSON

JSON(JavaScript Object Notation,JavaScript对象表示法),是一种轻量级的数据交换格式。JSON文本以纯文本方式表示,并且可以被多种编程语言解析和生成。

JSON由两种数据结构组成:

  • 键值对集合,用于表示对象或复杂数据结构。
  • 值列表,用于表示数组或简单数据结构。

JSON数据有以下特点:

  • 可读性强,在程序员之间使用非常流行。
  • 所有的现代编程语言都支持JSON。
  • 不依赖于任何语言。

常用的C# JSON解析库

目前在C#中实现JSON解析的库有许多,比如:

  • Json.NET(Newtonsoft.Json)
  • System.Text.Json
  • fastJSON
  • SimpleJson

这里我们主要介绍Json.NET和System.Text.Json两个库,它们都是由Microsoft所提供的,并且都是开源的,非常容易上手。

Json.NET

Json.NET是一个常用的、活跃的Json解析库,它提供了从Json到.Net对象和从.Net对象到Json的序列化和反序列化功能。

优点

  • 可以处理Json中任意的多层嵌套结构。
  • 可以处理不规则的Json格式。
  • 支持Json中的转义字符。
  • 速度较快。

示例

Json到.NET对象

下面是一个Json对象:

{
    "name": "John Smith",
    "email": "john.smith@example.com",
    "age": 25,
    "address": {
        "city": "New York",
        "zip": "10001"
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "123-456-7890"
        },
        {
            "type": "work",
            "number": "098-765-4321"
        }
    ]
}

我们可以使用Json.NET将其转换为.Net对象:

using Newtonsoft.Json;

string json = @"{
    ""name"": ""John Smith"",
    ""email"": ""john.smith@example.com"",
    ""age"": 25,
    ""address"": {
        ""city"": ""New York"",
        ""zip"": ""10001""
    },
    ""phoneNumbers"": [
        {
            ""type"": ""home"",
            ""number"": ""123-456-7890""
        },
        {
            ""type"": ""work"",
            ""number"": ""098-765-4321""
        }
    ]
}";

dynamic result = JsonConvert.DeserializeObject(json);

string name = result.name;
string email = result.email;
int age = result.age;
string city = result.address.city;
string homePhone = result.phoneNumbers[0].number;
string workPhone = result.phoneNumbers[1].number;

.NET对象到Json

下面是一个.Net对象:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Email { get; set; }
    public Address Address { get; set; }
    public List<PhoneNumber> PhoneNumbers { get; set; }
}

public class Address
{
    public string City { get; set; }
    public string Zip { get; set; }
}

public class PhoneNumber
{
    public string Type { get; set; }
    public string Number { get; set; }
}

我们可以使用Json.NET将其转换为Json字符串:

using Newtonsoft.Json;

Person person = new Person
{
    Name = "John Smith",
    Age = 25,
    Email = "john.smith@example.com",
    Address = new Address
    {
        City = "New York",
        Zip = "10001"
    },
    PhoneNumbers = new List<PhoneNumber>
    {
        new PhoneNumber
        {
            Type = "home",
            Number = "123-456-7890"
        },
        new PhoneNumber
        {
            Type = "work",
            Number = "098-765-4321"
        }
    }
};

string json = JsonConvert.SerializeObject(person);

System.Text.Json

System.Text.Json是Microsoft在.NET Core 3.0中提供的新的Json解析库,它对Json.NET进行了优化和改进。

优点

  • 支持异步操作。
  • 支持JsonPropertyName自定义属性名。
  • 内存开销较小。
  • 解析速度比Json.NET更快。

示例

Json到.NET对象

下面是一个Json对象:

{
    "name": "John Smith",
    "email": "john.smith@example.com",
    "age": 25,
    "address": {
        "city": "New York",
        "zip": "10001"
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "123-456-7890"
        },
        {
            "type": "work",
            "number": "098-765-4321"
        }
    ]
}

我们可以使用System.Text.Json将其转换为.Net对象:

using System.Text.Json;

string json = @"{
    ""name"": ""John Smith"",
    ""email"": ""john.smith@example.com"",
    ""age"": 25,
    ""address"": {
        ""city"": ""New York"",
        ""zip"": ""10001""
    },
    ""phoneNumbers"": [
        {
            ""type"": ""home"",
            ""number"": ""123-456-7890""
        },
        {
            ""type"": ""work"",
            ""number"": ""098-765-4321""
        }
    ]
}";

var document = JsonDocument.Parse(json);
var root = document.RootElement;

string name = root.GetProperty("name").GetString();
string email = root.GetProperty("email").GetString();
int age = root.GetProperty("age").GetInt32();
string city = root.GetProperty("address").GetProperty("city").GetString();
string homePhone = root.GetProperty("phoneNumbers")[0].GetProperty("number").GetString();
string workPhone = root.GetProperty("phoneNumbers")[1].GetProperty("number").GetString();

.NET对象到Json

下面是一个.Net对象:

public class Person
{
    [JsonPropertyName("name")]
    public string Name { get; set; }
    [JsonPropertyName("age")]
    public int Age { get; set; }
    [JsonPropertyName("email")]
    public string Email { get; set; }
    [JsonPropertyName("address")]
    public Address Address { get; set; }
    [JsonPropertyName("phoneNumbers")]
    public List<PhoneNumber> PhoneNumbers { get; set; }
}

public class Address
{
    [JsonPropertyName("city")]
    public string City { get; set; }
    [JsonPropertyName("zip")]
    public string Zip { get; set; }
}

public class PhoneNumber
{
    [JsonPropertyName("type")]
    public string Type { get; set; }
    [JsonPropertyName("number")]
    public string Number { get; set; }
}

我们可以使用System.Text.Json将其转换为Json字符串:

using System.Text.Json;

Person person = new Person
{
    Name = "John Smith",
    Age = 25,
    Email = "john.smith@example.com",
    Address = new Address
    {
        City = "New York",
        Zip = "10001"
    },
    PhoneNumbers = new List<PhoneNumber>
    {
        new PhoneNumber
        {
            Type = "home",
            Number = "123-456-7890"
        },
        new PhoneNumber
        {
            Type = "work",
            Number = "098-765-4321"
        }
    }
};

var options = new JsonSerializerOptions
{
    WriteIndented = true
};
string json = JsonSerializer.Serialize(person, options);

结论

Json.NET和System.Text.Json都是非常流行、易于上手的C# Json解析库。你可以根据你的需求选择使用其中的一种,或者将它们结合使用。

无论你使用哪种Json解析库,你都应该熟悉Json的格式,并且掌握Json解析和生成的基本方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现json格式数据解析功能的方法详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++实现四叉树效果(附源码下载)

    C++实现四叉树效果(附源码下载) 四叉树也称为四元树或者八叉树,是一种树形数据结构,其特点是每个内部节点有四个子节点或是八个子节点。四叉树在计算机图形学和图像处理领域中得到了广泛应用。本文将讲解如何用 C++ 实现四叉树,并提供源码下载。 实现思路 基本概念 四叉树的基本概念是将二维空间划分为四个象限,每个象限为一个节点。每个节点又可以继续向下划分,直到一…

    C 2023年5月23日
    00
  • Java中Objects.equals踩坑记录

    Java中Objects.equals踩坑记录 在Java语言中,有一个Objects.equals()方法可以用来比较两个对象是否相等。不过在使用过程中,有一些需要注意的地方,否则可能会出现令人意想不到的错误。本文将介绍一些在使用Objects.equals()方法时需要注意的地方,以避免踩坑。 对比Null值 在比较对象时,可能存在其中一个对象为null…

    C 2023年5月23日
    00
  • python 中if else 语句的作用及示例代码

    当我们需要根据某个条件来执行不同的代码,就需要使用到if else语句。if else语句在Python中非常常见且非常重要,其基本结构如下: if 条件: # 条件成立时要执行的代码块 else: # 条件不成立时要执行的代码块 其中,条件可为任何可以转换成布尔值True或者False的表达式,如比较运算符(>、<、==、!=等)、逻辑运算符(…

    C 2023年5月22日
    00
  • C语言WinSock学习笔记

    下面我来详细讲解一下《C语言WinSock学习笔记》的完整攻略。 一、WinSock是什么 WinSock (Windows Sockets) 是一种技术,允许应用程序通过 TCP/IP 协议来进行网络通信,是 Windows 操作系统自带的一个 API。WinSock 可以使用基于 TCP 或者 UDP 协议的 Socket 通信方式来实现网络应用。 二、…

    C 2023年5月22日
    00
  • C++ Boost log日志库超详细讲解

    C++ Boost log日志库超详细讲解 什么是C++ Boost log日志库? C++ Boost log是一个高度灵活和可定制的C++日志库,它提供了一系列便利的接口和功能,帮助我们实现日志的收集、保存、查询和分析等操作。同时,它还提供了多种日志输出格式和输出目标,例如标准输出、文件、syslog等。 安装C++ Boost log日志库 在使用C+…

    C 2023年5月22日
    00
  • C语言指针预定义类型

    C语言中,为了让指针类型更加易于使用和理解,已经预定义了几种指针类型。下面是它们的名称和描述: void *:指向任意类型的指针。 char *:指向字符类型的指针。 int *:指向整型的指针。 float *:指向单精度浮点类型的指针。 double *:指向双精度浮点类型的指针。 使用这些预定义的指针类型,可以更快地定义和使用指针类型变量,而不必手动指…

    C 2023年5月9日
    00
  • windows下如何安装OpenCL

    安装OpenCL可以使你的电脑更好地支持并行计算、图形处理、机器学习等任务。以下是Windows下安装OpenCL的完整攻略。 一、检查显卡是否支持OpenCL 在安装OpenCL之前,需要确保你的显卡支持OpenCL。可以在显卡厂商的官网上查找相关信息,或者使用GPU-Z、Speccy等工具检查显卡信息。 二、下载OpenCL驱动程序 下载对应的OpenC…

    C 2023年5月23日
    00
  • C++实现职工信息管理系统

    C++实现职工信息管理系统 介绍 C++实现职工信息管理系统是一个简单的控制台应用程序,用于管理一个公司中的职工信息。主要的功能包括添加职工、显示职工列表、删除职工、修改职工信息等。 实现步骤 步骤一:设计职工信息类 我们首先需要设计一个职工信息类,它包括职工编号、职工姓名、职工职位和职工性别等信息。这个类可以使用C++中的结构体来实现。 // 职工信息结构…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部