Сериализация модели C# с пользовательским списком в JSON

У меня есть модель со списком, который мне нужно сериализовать в JSON, чтобы отправить запрос в веб-службу.

Проблема в том, что в моей модели есть список, который нужно сериализовать в определенном формате.

Мой класс выглядит следующим образом:

[DataContract()]
public class StanjeZalihaLek : BaseParameters
{
    [DataMember(Name = "datumStanje")]
    public string _datumStanja;

    [DataMember(Name = "type")]
    public int Type { get; set; }
    [IgnoreDataMember]
    public DateTime? DatumStanja { get; set; }        
    [IgnoreDataMember()]
    public List<Lek> ListaLek { get; set; }

    [OnSerializing()]
    protected void OnSerializingMethod(StreamingContext context)
    {
        _datumStanja = DatumStanja?.ToString(FormatDate);
    }
}

Итак, все элементы в порядке, кроме списка ListaLek { get; задавать; } элемент, который выглядит следующим образом:

   [DataContract()]
   public class Lek
{
    const string FormatDate = "dd.MM.yyyy";

    [DataMember(Name = "datumUlaz")]
    string _datumUlaza;
    [DataMember(Name = "datumRok")]
    string _rokUpotrebe;

    [DataMember(Name = "jkl")]
    public string JedinstvenaKlasifikacijaLeka { get; set; }
    [DataMember(Name = "kolicina)")]
    public double Kolicina { get; set; }
    [DataMember(Name = "kpp")]
    public string Kpp { get; set; }
    [IgnoreDataMember]
    public DateTime? DatumUlaza { get; set; }
    [IgnoreDataMember]
    public DateTime? RokUpotrebe { get; set; }


    [OnSerializing()]
    protected void OnSerializingMethod(StreamingContext context)
    {
        _datumUlaza = DatumUlaza?.ToString(FormatDate);
        _rokUpotrebe = RokUpotrebe?.ToString(FormatDate);
    }
}

Вот как должен выглядеть мой сериализованный код:

{
    "idZu": "12345678",
    "user": "ustanova1",
    "pass": "pass1w0rd",
    "type": "1",
    "datumStanje": "26.02.2019",
    "0": {
        "jkl": "0010200",
        "kolicina": "4",
        "kpp": "071",
        "datumUlaz": "26.02.2019",
        "datumRok": " 31.12.2019"
    },
    "1": {
        "jkl": "0010220",
        "kolicina": "8",
        "kpp": "071",
        "datumUlaz": "26.02.2019",
        "datumRok": " 31.12.2019"
    },
    "2": {
        "jkl": "12205014",
        "kolicina": "12",
        "kpp": "071",
        "datumUlaz": "26.02.2019",
        "datumRok ": "31.12.2019"
    }
}

Таким образом, каждый новый элемент списка имеет номер в качестве имени DataMember, а idZu, user и pass являются параметрами из класса BaseParameters, производного от StanjeZalihaLek.

Есть идеи? Спасибо

Возможный дубликат Сериализация списка в JSON

Anas Alweish 22.05.2019 14:21

Итак... вы хотите сгладить "ЛистаЛек" в сериализованном родительском объекте "СтаньеЗалихаЛек"? вместо правильной сериализации массива?

MKougiouris 22.05.2019 14:21

Не уверен, что вы подразумеваете под «сглаживанием». Я хочу сериализовать объект StanjeZalihaLek и внутри него сериализовать список ListaLek, при этом каждый элемент списка имеет имя сериализации 0, 1, 2, 3... В зависимости от того, сколько элементов Список есть у @MKougiouris

ConsS 22.05.2019 14:30

Под сглаживанием я подразумеваю, что обычно в вашем выводе должен быть элемент «ListaLek», содержащий сериализованный массив, но вместо этого вы хотите сериализовать элементы списка с их индексом в качестве имени члена в родительском объекте. Для этого вам нужно сначала создать новый динамический объект, так как один раз в списке может быть 1 элемент, а другой список может содержать 100 элементов. Итак, сначала подумайте о создании динамического объекта, а затем пользовательского сериализатора... Этот запрос очень странный, но какой API ожидает список таким образом!?

MKougiouris 22.05.2019 14:36

Да, точно, я знаю, что это странно, но это единственный формат, который принимает WebService, есть идеи, как это сделать? @MKougiouris

ConsS 22.05.2019 14:38

Вам нужно иметь возможность как десериализовать json в объекты, так и сериализовать объекты в json?

Lasse V. Karlsen 22.05.2019 14:40

С частью десериализации я разобрался. Я получаю соответствующий ответ от сервера в зависимости от значений параметров. Единственная проблема - это параметр списка, так как я не могу отправить запрос в соответствующем формате. @LasseVågsætherKarlsen

ConsS 22.05.2019 14:47

И под «отправить запрос» вы имеете в виду: у вас есть объекты .NET в памяти и вам нужно создать правильный Json для отправки на сервер?

Lasse V. Karlsen 22.05.2019 14:50

Да, именно, у меня есть база данных и в ней хранимая процедура, из которой я получаю свои значения параметров объекта. @LasseVågsætherKarlsen

ConsS 22.05.2019 14:52

К сожалению, у меня не было правильно зарегистрировано, что вы используете DataContractJsonSerializer. Я понятия не имею, как это сделать, используя эти классы, или даже если это возможно. Извиняюсь. Мой теперь удаленный ответ показал способ сделать это с помощью Json.net, но если вы его не используете, я понятия не имею.

Lasse V. Karlsen 22.05.2019 14:57

@UrosDimitrijevic, вы можете взглянуть на этот сообщение

Alexandre Rodrigues 22.05.2019 15:20

Можете ли вы подтвердить, используете ли вы Json.NET или DataContractJsonSerializer? Если второе, не могли бы вы переключиться на что-то другое, возможно, даже на старое JavaScriptSerializer?

dbc 23.05.2019 09:25

Я использую DataContractJsonSerializer, я не могу переключиться, потому что у меня есть много классов, которые нужно будет переделать, если я это сделаю. Я решил проблему, я опубликую решение через секунду. Спасибо в любом случае :) @dbc

ConsS 23.05.2019 09:41
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
13
1 260
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Задача решена:

        public static byte[] Serialize(this StanjeZalihaLek data)
        {
            var sb = new StringBuilder();

            using (var tw = new System.IO.StringWriter(sb))
            {
                Newtonsoft.Json.JsonTextWriter jsonWriter = new JsonTextWriter(tw);
                jsonWriter.WriteStartObject();     

                jsonWriter.WriteRaw(JsonConvert
                                 .SerializeObject(data)
                                 .Substring(1)
                                 .TrimEnd('}'));

                jsonWriter.WriteRaw(",");

                int inx = 0;
                foreach (var item in data.ListaLek)
                {
                    var str = $"{inx++}";

                    jsonWriter.WritePropertyName(str);
                    jsonWriter.WriteRawValue(JsonConvert.SerializeObject(item));
                }
                jsonWriter.WriteEndObject();
                jsonWriter.Close();

            }

            return System.Text.Encoding.UTF8.GetBytes(sb.ToString());
        }

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