Неустранимые разрывы строк в строке JavaScript

У меня есть фрагмент кода, который сериализует объект JSON в строку в контроллере MVC C#. Затем мне нужно установить значение переменной JavaScript во внешнем интерфейсе с помощью этого сериализованного JSON.

Когда я пытаюсь десериализовать его обратно в объект JSON, я заметил, что JSON.parse продолжает ломаться. При дальнейшем осмотре сама строка, кажется, содержит символы новой строки (например, \n, \r). Однако, если я попытаюсь удалить его, код говорит, что новых строк не существует.

Вот куча вещей, которые я пробовал:

  • console.info(object.toString().indexOf("\r")); = возвращает -1. То же самое для \n, \r\n, \t и \f
  • console.info(object.toString().indexOf("\\r")); = то же, что и выше, с двойной обратной косой чертой на случай, если что-то пропустили.
  • console.info(object.replace(/[\t\r\n\f]/gm, "")); = строка по-прежнему выводит ту же строку со всеми включенными случайными разрывами строк. Пожалуйста, поправьте меня, если мое регулярное выражение неверно.
  • запуск этой строки через сайт, который показывает скрытые символы в строке (http://show-hidden-characters.dostring.com/) = он показывает, что строка имеет символы конца строки (LF) (например, «dob»: «1970-08-[Конец строки (LF)])
  • замена \r\n с помощью Notepad++ = работает, в строке заменено 48 вхождений. Странно, что это не работает с кодом.
  • запуск этой строки через веб-сайт JSON lint (https://jsonlint.com/) = показывает недопустимый JSON в точках, где есть разрывы строк

Код, который я использую для сериализации JSON:

converter.Options.HttpPostParameters.Add("object", JsonConvert.SerializeObject(object).Replace("\r\n", "").Replace("\n", "").Replace("\r", ""))

И я сохраняю его во внешнем интерфейсе с помощью тега script на странице Razor следующим образом:

<script>
    var object = "@HttpContext.Current.Request.Form["object"]";
</script>

Я в тупике по этому вопросу. Очевидно, что в переменной есть разрыв строки, но я просто не могу обнаружить или удалить его с помощью кода. В исходной строке в контроллере C# эти символы также удалены с помощью json.Replace("\r\n", "").Replace("\n", "").Replace("\r", ""), но каким-то образом они продолжают добавляться обратно в те же точки в JavaScript var.

Еще один момент разочарования заключается в том, что кажется непоследовательным, когда добавляются эти случайные разрывы строк. Одни разбивают строку даты рождения, другие просто применяют новую строку перед определенными ключами или значениями во всем объекте JSON. У кого-нибудь есть предложения?

«У меня есть фрагмент кода, который сериализует объект JSON в строку» — это код, который было бы полезно посмотреть. Я не уверен, почему вы пытаетесь изменить результирующую строку, а не контролировать ее создание.
Llama 20.02.2019 05:40

В основном это выглядит так: converter.Options.HttpPostParameters.Add("object", JsonConvert.SerializeObject(object).Replace("\r\n", "").Replace("\n", "").Replace("\r", "")) Доступ к интерфейсу Razor осуществляется через: @HttpContext.Current.Request.Form["object"]

Julian Wen Hsi Lee 20.02.2019 05:42

Можете ли вы отредактировать это в своем вопросе? По умолчанию JSON.Net должен сериализовать значение без разрывов строк. Чтобы уточнить: вы пытаетесь удалить разрывы строк или экранированные разрывы строк?

Llama 20.02.2019 05:42

Я пытаюсь удалить все разрывы строк, чтобы объект var можно было успешно десериализовать обратно в объект JSON с помощью JSON.parse.

Julian Wen Hsi Lee 20.02.2019 05:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
304
1

Ответы 1

Я не уверен, изменилось ли значение по умолчанию с течением времени, но текущее значение по умолчанию для JSON.NET — без форматирования. Вы можете вручную изменить это/установить это, если это не значение по умолчанию в вашей версии:

var noFormatting = new JsonSerializerSettings();
noFormatting.Formatting = Formatting.None;


var test = new {
    Name = "Test\r\nName",
    Value = "Test2"
};

Console.WriteLine(JsonConvert.SerializeObject(test, noFormatting));

Результат:

{"Name":"Test\r\nName","Value":"Test2"}

Или, как вы можете видеть в отладчике:

string value = "{\"Name\":\"Test\\r\\nName\",\"Value\":\"Test2\"}";

Обратите внимание, что в JsonSerializerSettings есть некоторые функции кэширования типов, поэтому он может быть быстрее, если вы используете общий экземпляр (т.е. не определяете его в цикле или определяете как поле в классе, где он часто используется).

Попробуйте онлайн

Эй, Джон, спасибо за это! Я попробовал, но, к сожалению, это ничего не изменило, var по-прежнему показывает тот же битый JSON. Я хотел попробовать вашу скрипку с моим текущим вводом, но похоже, что я не могу попробовать, поскольку JSON, который мы сериализуем на моем конце, передается через вызов Angular API и не преобразуется в какую-либо форму строго типизированного класс. По крайней мере, это, кажется, мое предположение.

Julian Wen Hsi Lee 20.02.2019 06:16

Вы же не двойную сериализацию? Можете ли вы попробовать просто вернуть свой объект без сериализации? Или вы можете предоставить все необходимое для минимальный воспроизводимый пример, чтобы я мог протестировать его на своем конце?

Llama 20.02.2019 06:30

Привет, извините за отсутствие ответа. Меня переназначили на что-то другое. Решение состояло в том, чтобы создать вызов WebAPI, который возвращает десериализованный JSON, чтобы сериализация и десериализация выполнялись через Json.NET.

Julian Wen Hsi Lee 26.02.2019 06:29

@Julian Не беспокойся :) Бывает. Вы должны добавить свой собственный ответ на случай, если он поможет людям в будущем. Если да, то отметьте меня, чтобы я могла проголосовать :)

Llama 26.02.2019 06:54

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