📘 Работа с XML и JSON в C#
Введение
C# поддерживает мощную работу с форматами XML и JSON, что важно при интеграции с внешними сервисами, хранении настроек и обмене данными.
Работа с XML
✅ XML Сериализация / Десериализация
using System.Xml.Serialization;
using System.IO;
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// Сериализация
var person = new Person { Name = "Anton", Age = 18 };
var serializer = new XmlSerializer(typeof(Person));
using var writer = new StreamWriter("person.xml");
serializer.Serialize(writer, person);
// Десериализация
using var reader = new StreamReader("person.xml");
var loaded = (Person)serializer.Deserialize(reader);
Console.WriteLine($"{loaded.Name}, {loaded.Age}");
🧩 XML Атрибуты и Вложенные Элементы
[XmlRoot("User")]
public class User
{
[XmlAttribute("id")]
public int Id { get; set; }
[XmlElement("FullName")]
public string Name { get; set; }
public ContactInfo Contacts { get; set; }
[XmlArray("Skills")]
[XmlArrayItem("Skill")]
public List<string> Skills { get; set; }
}
public class ContactInfo
{
public string Email { get; set; }
public string Phone { get; set; }
}
Пример XML:
<User id="1">
<FullName>Anton Aleynichenko</FullName>
<Contacts>
<Email>anton@example.com</Email>
<Phone>+71234567890</Phone>
</Contacts>
<Skills>
<Skill>C#</Skill>
<Skill>Docker</Skill>
</Skills>
</User>
🔍 XML вручную
XmlDocument
var doc = new XmlDocument();
doc.Load("user.xml");
var id = doc.DocumentElement.GetAttribute("id");
var name = doc.SelectSingleNode("//FullName")?.InnerText;
var skills = doc.SelectNodes("//Skill");
foreach (XmlNode skill in skills)
{
Console.WriteLine(skill.InnerText);
}
XElement (LINQ to XML)
var xml = XElement.Load("user.xml");
string id = xml.Attribute("id")?.Value;
string name = xml.Element("FullName")?.Value;
var skills = xml.Element("Skills")?.Elements("Skill");
foreach (var skill in skills)
{
Console.WriteLine(skill.Value);
}
Работа с JSON
✅ JSON Сериализация / Десериализация
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// System.Text.Json
var json1 = JsonSerializer.Serialize(new Person { Name = "Anton", Age = 18 });
var person1 = JsonSerializer.Deserialize<Person>(json1);
// Newtonsoft.Json
var json2 = JsonConvert.SerializeObject(new Person { Name = "Anton", Age = 18 }, Formatting.Indented);
var person2 = JsonConvert.DeserializeObject<Person>(json2);
⚙ JSON Расширенные настройки
public class User
{
[JsonProperty("full_name")]
public string Name { get; set; }
[JsonProperty("age_years")]
public int Age { get; set; }
[JsonProperty("contacts")]
public ContactInfo Contact { get; set; }
[JsonProperty("skills")]
public List<string> Skills { get; set; }
}
public class ContactInfo
{
public string Email { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string Phone { get; set; }
}
Результат сериализации:
{
"full_name": "Anton",
"age_years": 18,
"contacts": {
"Email": "anton@example.com"
},
"skills": ["C#", "Docker"]
}
🔍 JSON с dynamic / JObject
string json = File.ReadAllText("user.json");
// JObject (Newtonsoft)
var jObj = JObject.Parse(json);
string name = (string)jObj["full_name"];
string email = (string)jObj["contacts"]?["Email"];
foreach (var skill in jObj["skills"])
{
Console.WriteLine(skill);
}
// dynamic (можно только с Newtonsoft)
dynamic dyn = JsonConvert.DeserializeObject(json);
Console.WriteLine(dyn.full_name);
foreach (var s in dyn.skills)
{
Console.WriteLine(s);
}
Заключение
Формат | Простой доступ | Сложные структуры | Работа вручную | Рекомендованная библиотека |
---|---|---|---|---|
XML | XmlSerializer | Да (через атрибуты) | XmlDocument, XElement | System.Xml , System.Xml.Linq |
JSON | JsonSerializer / JsonConvert | Да (вложенные объекты, настройки) | JObject / dynamic | Newtonsoft.Json |
XmlSerializer
хорош для строго типизированных XML, но требует атрибутов.JsonConvert
даёт наибольшую гибкость при работе с JSON (особенно при нестандартной структуре).- Для ручного разбора документов лучше использовать
XElement
илиJObject
.