У меня есть следующая модель
public class MyModel {
public string Title;
public string Description;
public string Date;
}
Теперь у меня есть объект IEnumerable, содержащий множество MyModels.
{
data: [
{
Title: xxx,
Description: yyy,
Date: 2024-12-03
},
{
Title: xxx,
Description: yyy,
Date: 2024-12-04
},
{
Title: xxx,
Description: yyy,
Date: 2024-12-05
},
{
Title: xxx,
Description: yyy,
Date: 2024-12-06
}
]
}
Я хотел бы сериализовать только даты. Как бы мне это сделать? Следующее, очевидно, не работает.
var serialized = JsonConvert.SerializeObject(data.date)
Какую библиотеку вы используете? Информацию о system.text.json см. в разделе Как игнорировать свойства.
Если data
— это коллекция экземпляров MyModel
, а вам нужна просто коллекция экземпляров string
одного свойства этой модели, вы можете использовать .Select(), чтобы проецировать первое во второе. Например:
var serialized = JsonConvert.SerializeObject(data.Select(d => d.Date));
Так просто. Я новичок в C#, перешел с PHP, поэтому знал, что есть быстрый способ сделать это. Я просто не знал синтаксиса. Большое спасибо за вашу помощь
Вы можете использовать LINQ для извлечения дат из вашего IEnumerable, а затем сериализовать полученный список дат. Вот как вы можете это сделать:
var dates = data.Select(m => m.Date);
var serialized = JsonConvert.SerializeObject(dates);
Это даст вам строку JSON, содержащую массив дат:
["2024-12-03", "2024-12-04", "2024-12-05", "2024-12-06"]
Обратите внимание: в этом ответе предполагается, что ваш класс модели использует свойства, а не поля. Ваш текущий опубликованный код использует поля. Я бы посоветовал вам перейти на «Свойства».
Это зависит от того, как вы хотите, чтобы результат выглядел.
Если вы хотите, чтобы выходные данные представляли собой массив объектов, где каждый объект содержит свойство Date (это будет тот же формат, который у вас есть сейчас, просто удаляя все остальные свойства объекта), например:
[
{ "Date": "2024-12-03" },
{ "Date": "2024-12-04" },
// etc...
]
затем вам нужно создать и передать в SerializeObject
новый тип данных, который имеет только свойство Date C#. Самый простой способ сделать это — использовать анонимный тип (new { ... }
) в сочетании с Select
LINQ.
var serialized = JsonConvert.SerializeObject(data.Select(x => new {
Date = x.Date // you could also just do "x.Date"
});
Если бы у вас была в этом необходимость, вы могли бы создать свой собственный конкретный класс для минимального количества данных. Это позволяет вам повторно использовать его в другом месте.
class MyModelMinimal
{
public string Date { get; set; }
}
// ...
var serialized = JsonConvert.SerializeObject(data.Select(x => new MyModelMinimal
{
Date = x.Date
});
Вы также можете «игнорировать» другие свойства в вашей модели, применив атрибут [JsonIgnore]
(убедитесь, что это правильный атрибут для Newtonsoft.Json или System.Text.Json), однако я подозреваю, что вы также используете MyModel
для десериализации JSON. , поэтому игнорирование свойств помешает результату десериализации.
Если вы хотите, чтобы выходные данные представляли собой массив строк, где каждая строка является значением свойства Date
C#:
[
"2024-12-03",
"2024-12-04",
// etc...
]
вы можете изменить приведенное выше, чтобы проецировать только свойство Date в виде строки, а не проецировать новый объект со свойством Date.
var serialized = JsonConvert.SerializeObject(data.Select(x => x.Date);
Поскольку вы новичок в C#, следующее (практически) одно и то же:
List<string> dateValues = new List<string>();
foreach (var model in data)
{
dateValues.Add(model.Date);
}
var serialized = JsonConvert.SerializeObject(dateValues);
И это эквивалент первого варианта с использованием пользовательского класса:
List<MyModelMinimal> newModels = new List<MyModelMinimal>();
foreach (var model in data)
{
MyModelMinimal newModel = new MyModelMinimal
{
Date = model.Date;
};
newModels .Add(newModel);
}
var serialized = JsonConvert.SerializeObject(newModels);
LINQ позволяет манипулировать коллекциями с меньшим количеством кода.
Чтобы сериализовать только даты из вашего IEnumerable<MyModel>
, вы можете выполнить следующие шаги:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
public class MyModel
{
public string Title { get; set; }
public string Description { get; set; }
public string Date { get; set; }
}
class Program
{
static void Main()
{
var data = new List<MyModel>
{
new MyModel { Title = "xxx", Description = "yyy", Date = "2024-12-03" },
new MyModel { Title = "xxx", Description = "yyy", Date = "2024-12-04" },
new MyModel { Title = "xxx", Description = "yyy", Date = "2024-12-05" },
new MyModel { Title = "xxx", Description = "yyy", Date = "2024-12-06" }
};
// Extract the dates
var dates = data.Select(model => model.Date);
// Serialize the dates
var serialized = JsonConvert.SerializeObject(dates);
// Output the serialized dates
Console.WriteLine(serialized);
}
}
Как вы хотите, чтобы выводимый JSON выглядел?