Несколько названий свойств JSON в свойстве

У меня есть требование, согласно которому у меня должно быть свойство, которое может связать его значение с помощью «debtAmount» или «Amount».

Я пытался получить аннотацию сверху, и она работает для долга, но значение не будет связываться с использованием «суммы».

Я хочу получить одну необязательную привязку для одного свойства (по сумме или по долгу).

Самый верхний ответ в этой теме не соответствует требованиям ремонтопригодности, поскольку в конечном итоге у него появятся дополнительные свойства, которые потребуют привязки нескольких имен. Поэтому я не хочу, чтобы на каждую общественную собственность добавлялась дополнительная частная собственность.

@jason.kaisersmith, спасибо за уведомление. Я обновил вопрос

Edison C 12.07.2024 20:07
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

если вам нужно несколько свойств JSON во время десериализации, вы можете использовать JsonConverter

public class NewAccountRequestJsonConverter : JsonConverter<NewAccountRequest>
{
    public override NewAccountRequest Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var newAccountRequest = new NewAccountRequest();

        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndObject)
                return newAccountRequest;

            if (reader.TokenType == JsonTokenType.PropertyName)
            {
                string propertyName = reader.GetString();

                if (propertyName == "amount" || propertyName == "debtAmount")
                {
                    reader.Read();
                    newAccountRequest.Amount = reader.GetDecimal();
                }
                else
                {
                    reader.Skip();
                }
            }
        }

        throw new JsonException();
    }

    public override void Write(Utf8JsonWriter writer, NewAccountRequest value, JsonSerializerOptions options)
    {
        writer.WriteStartObject();
        writer.WriteNumber("amount", value.Amount);
        writer.WriteEndObject();
    }
}

Во время Deserialize используйте это NewAccountRequestJsonConverter как вариант

 var options = new JsonSerializerOptions();
 options.Converters.Add(new NewAccountRequestJsonConverter());

 var result = JsonSerializer.Deserialize<NewAccountRequest>(jsonString, options);

это идеальное решение

Edison C 13.07.2024 04:42

Один из уже представленных подходов состоит в том, чтобы поместить некоторую логику сопоставления внутри JsonConverter (наследовать от него и переопределить некоторую логику).

Второй подход, как я вижу, может состоять в сопоставлении обоих полей с соответствующими полями Amount и debtAmount и иметь некоторый метод для получения этой информации на основе обоих свойств, что-то в этом роде:

public static class Extensions
{
    public static decimal? GetAmount(this NewAccountRequest request) =>
        request.Ammount ?? request.DebtAmount;
}

Вам нужно будет сделать поля сумм обнуляемыми, чтобы определить, когда они вообще не предоставляются. Или вы можете рассматривать значение по умолчанию 0 как «пустое значение», если 0 не будет допустимым числом.

я выберу первый подход, потому что со временем у этого класса появятся другие свойства.

Edison C 13.07.2024 04:07

@EdisonC на этот подход не повлияют новостные предложения, в конвертере вам необходимо добавить дополнительную логику для новостных реквизитов.

Michał Turczyn 13.07.2024 10:06

Это означает, что если есть 25 новых реквизитов, это значит, что будет еще 25, верно? Если да, то это будет проблемой в ремонтопригодности

Edison C 13.07.2024 11:33

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