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技术站