t5_files_types.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using System.Globalization;
  2. using CsvHelper;
  3. using CsvHelper.Configuration;
  4. using (var reader = new StreamReader("./test.csv"))
  5. {
  6. using (var csv = new CsvReader(
  7. reader, CultureInfo.InvariantCulture))
  8. {
  9. var records = csv.GetRecords<Foo>();
  10. foreach (var record in records)
  11. {
  12. Console.WriteLine("{0}, {1}", record.description, record.value);
  13. }
  14. }
  15. }
  16. public class Foo
  17. {
  18. public string description { get; set; }
  19. public double value { get; set; }
  20. }
  21. // использую не стандартный формат
  22. var config = new CsvConfiguration(
  23. CultureInfo.InvariantCulture)
  24. {
  25. Delimiter = ";",
  26. HasHeaderRecord = false
  27. };
  28. // создаю тестовые данные
  29. var records = new List<Foo>
  30. {
  31. new Foo {
  32. description ="тест записи\nмногострочного текста",
  33. value = 12.34 },
  34. new Foo {
  35. description = "просто, текст, с запятыми",
  36. value = 0 }
  37. };
  38. using (var writer = new StreamWriter("./test3.csv"))
  39. using (var csv = new CsvWriter(writer, config))
  40. {
  41. csv.WriteRecords(records);
  42. }
  43. ```
  44. csv
  45. "строка с пробелами"; 123,15
  46. "строка
  47. с переносом
  48. строки";456
  49. ```
  50. Разделитель полей мы менять умеем, но как быть с форматом чисел?
  51. Нужно задать нужную культурную среду:
  52. ```
  53. cs
  54. var config = new CsvConfiguration(
  55. new CultureInfo("ru-RU"))
  56. {
  57. Delimiter = ";",
  58. HasHeaderRecord = false
  59. };
  60. ```
  61. ## JSON
  62. json
  63. {
  64. "firstname": "Михаил",
  65. "lastname": "Максимов",
  66. "phone": "+79201234567",
  67. "city": "Москва",
  68. "age": 37,
  69. "bonus": 2000,
  70. "prev": [
  71. "Кроссовки",
  72. "Турник",
  73. "Зимняя куртка"
  74. ]
  75. }
  76. ```
  77. ### Newtonsoft.Json
  78. ```
  79. cs
  80. var person = new Person
  81. {
  82. name = "Имя",
  83. age = 18,
  84. date = "2024-03-07"
  85. };
  86. string json = JsonConvert.SerializeObject(
  87. person, Formatting.Indented);
  88. Console.WriteLine(json);
  89. ```
  90. Должны получить что-то подобное:
  91. ```
  92. json
  93. {
  94. "name": "Имя",
  95. "age":18,
  96. "date":"2024-03-07"
  97. }
  98. ### Работа с JSON. DataContractJsonSerializer.
  99. cs
  100. [DataContract]
  101. internal class Person
  102. {
  103. [DataMember]
  104. public string name;
  105. [DataMember]
  106. public int age;
  107. [DataMember]
  108. public DateTime date;
  109. }
  110. **Сериализация * *(Преобразование объекта в JSON-строку)
  111. cs
  112. var PersonList = new List<Person>() {
  113. new Person {name="Иванов", age=25, date=new DateTime(2021,1,1)},
  114. new Person {name="Петров", age=35, date=new DateTime(2021,1,2)}
  115. };
  116. // создаем объект сериализатора, указав, что на входе
  117. // будет МАССИВ объектов Person
  118. var Serializer = new DataContractJsonSerializer(typeof(Person[]));
  119. using (var streamWriter = new StreamWriter("test1.json"))
  120. {
  121. Serializer.WriteObject(
  122. streamWriter.BaseStream,
  123. // Преобразуем список (List) объектов в МАССИВ
  124. PersonList.ToArray()
  125. );
  126. }
  127. json
  128. [{ "age":25,"date":"\/Date(1609448400000+0300)\/","name":"Иванов"},{ "age":35,"date":"\/Date(1609534800000+0300)\/","name":"Петров"}]
  129. **Десериализация * *(Преобразование JSON - строки в объект)
  130. cs
  131. [DataContract]
  132. internal class Person
  133. {
  134. // создаем приватную переменную для хранения даты
  135. private DateTime privateDate;
  136. [DataMember]
  137. public string name { get; set; }
  138. [DataMember]
  139. public string age { get; set; }
  140. // создаем ПРИВАТНОЕ СТРОКОВОЕ свойство и с помощью атрибутов меняем ему имя для сериализатора
  141. [DataMember(Name = "date")]
  142. private string StringDate
  143. {
  144. get
  145. {
  146. return privateDate.ToString("yyyy-MM-dd");
  147. }
  148. set
  149. {
  150. // 2021-03-21
  151. // 0123456789
  152. privateDate = new DateTime(
  153. Convert.ToInt32(value.Substring(0, 4)),
  154. Convert.ToInt32(value.Substring(5, 2)),
  155. Convert.ToInt32(value.Substring(8, 2))
  156. );
  157. }
  158. }
  159. // публичное свойство "дата" скрываем от сериализатора
  160. [IgnoreDataMember]
  161. public DateTime date
  162. {
  163. get { return privateDate; }
  164. set { privateDate = value; }
  165. }
  166. }
  167. ## Вариант попроще
  168. cs
  169. // целевые классы нам по прежнему нужны, но уже без всяких аннотаций
  170. internal class MaterialTC
  171. {
  172. public string Title { get; set; }
  173. public int Count { get; set; }
  174. }
  175. internal class Notice
  176. {
  177. public Material[] data;
  178. }
  179. internal class Answer
  180. {
  181. public Notice notice;
  182. }
  183. // в месте, где нам нужно распарсить JSON создаем сериализатор и разбираем строку
  184. var serializer = new JavaScriptSerializer();
  185. var answer = serializer.Deserialize<Answer>("тут ваша JSON-строка");
  186. // и ВСЁ