Как сериализовать одно свойство объекта массивов

У меня есть следующая модель

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)

Как вы хотите, чтобы выводимый JSON выглядел?

gunr2171 12.08.2024 15:44

Какую библиотеку вы используете? Информацию о system.text.json см. в разделе Как игнорировать свойства.

JonasH 12.08.2024 15:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
50
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Если data — это коллекция экземпляров MyModel, а вам нужна просто коллекция экземпляров string одного свойства этой модели, вы можете использовать .Select(), чтобы проецировать первое во второе. Например:

var serialized = JsonConvert.SerializeObject(data.Select(d => d.Date));

Так просто. Я новичок в C#, перешел с PHP, поэтому знал, что есть быстрый способ сделать это. Я просто не знал синтаксиса. Большое спасибо за вашу помощь

Typhoon101 12.08.2024 15:58

Вы можете использовать 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);
    }
}

Другие вопросы по теме