Удаление обратных наклонных знаков Escape в выходных данных C# JSON

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

application/json

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

Из того, что я прочитал, это, вероятно, результат используемой сериализации, но, несмотря на то, что я попробовал несколько решений, я не могу решить проблему.

Модель данных

public class Response
{
    public string name { get; set; }
    public string surname { get; set; }
    public string address { get; set; }
    public string telephone { get; set; }
    public string email { get; set; }
    public string dateOfBirth { get; set; }
    public string sex { get; set; }
    public string countryOfBirth { get; set; }
    public string currency { get; set; }
}

Метод

public class DatasetServices
    {
        public string GenerateDataset()
        {
            int counter = 3;

            StringBuilder result = new StringBuilder();

            for (int i = 0; i < counter; i++)
            {
                try
                {
                    Dataset dataset = new Dataset();
                    Dataset.Item item = new Dataset.Item();

                    string apiKey = "KEY";
                    HttpWebRequest apiRequest = WebRequest.Create("URI" + apiKey) as HttpWebRequest;

                    string apiResponse = "";
                    using (HttpWebResponse response = apiRequest.GetResponse() as HttpWebResponse)
                    {
                        StreamReader reader = new StreamReader(response.GetResponseStream());
                        apiResponse = reader.ReadToEnd();
                    }

                    Response responseObject = JsonConvert.DeserializeObject<Response>(apiResponse);

                    item.name = responseObject.name;
                    item.surname = responseObject.surname;
                    item.address = responseObject.address;
                    item.city = GenerateCity();
                    item.telephone = responseObject.telephone;
                    item.email = responseObject.email;
                    item.dateOfBirth = responseObject.dateOfBirth;
                    item.sex = responseObject.sex;
                    item.maritalStatus = GenerateMaritalStatus();
                    item.nationality = responseObject.countryOfBirth;
                    item.countryOfBirth = responseObject.countryOfBirth;
                    item.grossAnnualIncome = GenerateGrossAnnualIncome();
                    item.currency = responseObject.currency;

                    var json = JsonConvert.SerializeObject(item);

                    result.Append(json);

                }
                catch (Exception)
                {
                    if (i == counter)
                    {
                        throw;
                    }
                }
            }
            string output = result.ToString();
            return output;

            throw new ArgumentOutOfRangeException("The generation counter was equal to zero.");
        }

Контроллер

        [HttpGet]
        public ActionResult<IEnumerable> OutputDataset()
        {
            Response.ContentType = "application/json";
            return datasetServices.GenerateDataset();
        }

Результат

"{\"name\":\"Sibby\",\"surname\":\"Packman\",\"address\":\"59 Aberg Alley\",\"city\":\"San Javier\",\"telephone\":\"6322049027\",\"email\":\"[email protected]\",\"dateOfBirth\":\"10/22/1987\",\"sex\":\"Female\",\"maritalStatus\":\"Single\",\"nationality\":\"RU\",\"countryOfBirth\":\"RU\",\"grossAnnualIncome\":71000,\"currency\":\"RUB\"}{\"name\":\"Mariska\",\"surname\":\"Worrell\",\"address\":\"927 Green Ridge Point\",\"city\":\"Frisco\",\"telephone\":\"5668115189\",\"email\":\"[email protected]\",\"dateOfBirth\":\"10/1/1998\",\"sex\":\"Female\",\"maritalStatus\":\"Single\",\"nationality\":\"GT\",\"countryOfBirth\":\"GT\",\"grossAnnualIncome\":24000,\"currency\":\"GTQ\"}{\"name\":\"Eleonore\",\"surname\":\"Follan\",\"address\":\"3876 Colorado Avenue\",\"city\":\"Mont-Dore\",\"telephone\":\"4004483706\",\"email\":\"[email protected]\",\"dateOfBirth\":\"3/6/1992\",\"sex\":\"Female\",\"maritalStatus\":\"Married\",\"nationality\":\"CN\",\"countryOfBirth\":\"CN\",\"grossAnnualIncome\":50000,\"currency\":\"CNY\"}"

Что заставляет вас думать, что результат содержит обратную косую черту? Вы уверены, что не только Visual Studio отображает вам строку?

DavidG 30.01.2019 18:09

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

Kurt 30.01.2019 18:14

То, что вы опубликовали, представляет собой строку, содержащую действительный JSON. Нам нужно больше узнать о вашей системе, чтобы определить, действительна она или нет.

DavidG 30.01.2019 18:14

Я использую Visual Studio Community 15.9.6 и .Net Framework 4.7.03056. Пожалуйста, сообщите, какая еще информация вам нужна.

Kurt 30.01.2019 19:15

Это действительно полный ответ на вызов API? Я подозреваю, что [ и ] отсутствуют.

fredrik 30.01.2019 19:45

Да, это все, что есть. Что-то определенно не так.

Kurt 30.01.2019 19:47

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

fredrik 30.01.2019 20:20

Попробовал, но результат идентичен.

Kurt 30.01.2019 20:34
OutputDataSet() возвращает ActionResult<IEnumerable>, но GenerateDataset() возвращает string. Единственная причина, по которой это работает, заключается в том, что string реализует IEnumerable<char>, что означает, что в основном ваш метод возвращает перечисление объектов, которые могут быть чем угодно, но не символами. ...
dbc 30.01.2019 21:14

Это странная вещь, и я удивлен, что она вообще работает, но результат, похоже, является дубликатом JSON.NET Parser кажется будет дважды сериализовать мои объекты. И решение должно быть таким же - объявите, что ваш метод возвращает ActionResult<IEnumerable<T>> для некоторого подходящего T (здесь, видимо, Dataset.Item?), и позвольте фреймворку выполнить сериализацию. Не делай этого сам.

dbc 30.01.2019 21:16

Имеет смысл, поскольку я подозревал, что причиной была сериализация. Однако объявление о том, что метод возвращает ActionResult<IEnumerable<Dataset.Item>>, создает другую проблему: преобразование результата из StringBuilder.

Kurt 30.01.2019 21:44

Не создавайте StringBuilder вообще; вообще ничего не сериализуйте вручную. Просто сделайте так, чтобы datasetServices.GenerateDataset(); возвращал List<Dataset.Item>, затем возвращал ActionResult<List<Dataset.Item>> из OutputDataset(), и пусть фреймворк сделает всю работу.

dbc 30.01.2019 21:55

Это помогло. Спасибо за помощь.

Kurt 31.01.2019 09:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
13
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот решение проблемы, любезно опубликованное dbc.

That's an odd things to do and I'm surprised it works at all, but the result seems to be a duplicate of JSON.NET Parser seems to be double serializing my objects. And the solution should be the same -- declare that your method returns an ActionResult> for some appropriate T (here ` Dataset.Item apparently?) and let the framework do the serialization. Don't do it yourself.

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