123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- using System.Globalization;
- using CsvHelper;
- using CsvHelper.Configuration;
- using (var reader = new StreamReader("./test.csv"))
- {
- using (var csv = new CsvReader(
- reader, CultureInfo.InvariantCulture))
- {
- var records = csv.GetRecords<Foo>();
- foreach (var record in records)
- {
- Console.WriteLine("{0}, {1}", record.description, record.value);
- }
- }
- }
- public class Foo
- {
- public string description { get; set; }
- public double value { get; set; }
- }
- // использую не стандартный формат
- var config = new CsvConfiguration(
- CultureInfo.InvariantCulture)
- {
- Delimiter = ";",
- HasHeaderRecord = false
- };
- // создаю тестовые данные
- var records = new List<Foo>
- {
- new Foo {
- description ="тест записи\nмногострочного текста",
- value = 12.34 },
- new Foo {
- description = "просто, текст, с запятыми",
- value = 0 }
- };
- using (var writer = new StreamWriter("./test3.csv"))
- using (var csv = new CsvWriter(writer, config))
- {
- csv.WriteRecords(records);
- }
- ```
- csv
- "строка с пробелами"; 123,15
- "строка
- с переносом
- строки";456
- ```
- Разделитель полей мы менять умеем, но как быть с форматом чисел?
- Нужно задать нужную культурную среду:
- ```
- cs
- var config = new CsvConfiguration(
- new CultureInfo("ru-RU"))
- {
- Delimiter = ";",
- HasHeaderRecord = false
- };
- ```
- ## JSON
- json
- {
- "firstname": "Михаил",
- "lastname": "Максимов",
- "phone": "+79201234567",
- "city": "Москва",
- "age": 37,
- "bonus": 2000,
- "prev": [
- "Кроссовки",
- "Турник",
- "Зимняя куртка"
- ]
- }
- ```
- ### Newtonsoft.Json
- ```
- cs
- var person = new Person
- {
- name = "Имя",
- age = 18,
- date = "2024-03-07"
- };
- string json = JsonConvert.SerializeObject(
- person, Formatting.Indented);
- Console.WriteLine(json);
- ```
- Должны получить что-то подобное:
- ```
- json
- {
- "name": "Имя",
- "age":18,
- "date":"2024-03-07"
- }
- ### Работа с JSON. DataContractJsonSerializer.
- cs
- [DataContract]
- internal class Person
- {
- [DataMember]
- public string name;
- [DataMember]
- public int age;
- [DataMember]
- public DateTime date;
- }
- **Сериализация * *(Преобразование объекта в JSON-строку)
- cs
- var PersonList = new List<Person>() {
- new Person {name="Иванов", age=25, date=new DateTime(2021,1,1)},
- new Person {name="Петров", age=35, date=new DateTime(2021,1,2)}
- };
- // создаем объект сериализатора, указав, что на входе
- // будет МАССИВ объектов Person
- var Serializer = new DataContractJsonSerializer(typeof(Person[]));
- using (var streamWriter = new StreamWriter("test1.json"))
- {
- Serializer.WriteObject(
- streamWriter.BaseStream,
- // Преобразуем список (List) объектов в МАССИВ
- PersonList.ToArray()
- );
- }
- json
- [{ "age":25,"date":"\/Date(1609448400000+0300)\/","name":"Иванов"},{ "age":35,"date":"\/Date(1609534800000+0300)\/","name":"Петров"}]
- **Десериализация * *(Преобразование JSON - строки в объект)
- cs
- [DataContract]
- internal class Person
- {
- // создаем приватную переменную для хранения даты
- private DateTime privateDate;
- [DataMember]
- public string name { get; set; }
- [DataMember]
- public string age { get; set; }
- // создаем ПРИВАТНОЕ СТРОКОВОЕ свойство и с помощью атрибутов меняем ему имя для сериализатора
- [DataMember(Name = "date")]
- private string StringDate
- {
- get
- {
- return privateDate.ToString("yyyy-MM-dd");
- }
- set
- {
- // 2021-03-21
- // 0123456789
- privateDate = new DateTime(
- Convert.ToInt32(value.Substring(0, 4)),
- Convert.ToInt32(value.Substring(5, 2)),
- Convert.ToInt32(value.Substring(8, 2))
- );
- }
- }
- // публичное свойство "дата" скрываем от сериализатора
- [IgnoreDataMember]
- public DateTime date
- {
- get { return privateDate; }
- set { privateDate = value; }
- }
- }
- ## Вариант попроще
- cs
- // целевые классы нам по прежнему нужны, но уже без всяких аннотаций
- internal class MaterialTC
- {
- public string Title { get; set; }
- public int Count { get; set; }
- }
- internal class Notice
- {
- public Material[] data;
- }
- internal class Answer
- {
- public Notice notice;
- }
- // в месте, где нам нужно распарсить JSON создаем сериализатор и разбираем строку
- var serializer = new JavaScriptSerializer();
- var answer = serializer.Deserialize<Answer>("тут ваша JSON-строка");
- // и ВСЁ
|