У меня есть фрагмент кода, который сериализует объект JSON в строку в контроллере MVC C#. Затем мне нужно установить значение переменной JavaScript во внешнем интерфейсе с помощью этого сериализованного JSON.
Когда я пытаюсь десериализовать его обратно в объект JSON, я заметил, что JSON.parse продолжает ломаться. При дальнейшем осмотре сама строка, кажется, содержит символы новой строки (например, \n, \r). Однако, если я попытаюсь удалить его, код говорит, что новых строк не существует.
Вот куча вещей, которые я пробовал:
console.info(object.toString().indexOf("\r")); = возвращает -1. То же самое для \n, \r\n, \t и \fconsole.info(object.toString().indexOf("\\r")); = то же, что и выше, с двойной обратной косой чертой на случай, если что-то пропустили.console.info(object.replace(/[\t\r\n\f]/gm, "")); = строка по-прежнему выводит ту же строку со всеми включенными случайными разрывами строк. Пожалуйста, поправьте меня, если мое регулярное выражение неверно.Код, который я использую для сериализации 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. У кого-нибудь есть предложения?
В основном это выглядит так: converter.Options.HttpPostParameters.Add("object", JsonConvert.SerializeObject(object).Replace("\r\n", "").Replace("\n", "").Replace("\r", "")) Доступ к интерфейсу Razor осуществляется через: @HttpContext.Current.Request.Form["object"]
Можете ли вы отредактировать это в своем вопросе? По умолчанию JSON.Net должен сериализовать значение без разрывов строк. Чтобы уточнить: вы пытаетесь удалить разрывы строк или экранированные разрывы строк?
Я пытаюсь удалить все разрывы строк, чтобы объект var можно было успешно десериализовать обратно в объект JSON с помощью JSON.parse.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не уверен, изменилось ли значение по умолчанию с течением времени, но текущее значение по умолчанию для 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 и не преобразуется в какую-либо форму строго типизированного класс. По крайней мере, это, кажется, мое предположение.
Вы же не двойную сериализацию? Можете ли вы попробовать просто вернуть свой объект без сериализации? Или вы можете предоставить все необходимое для минимальный воспроизводимый пример, чтобы я мог протестировать его на своем конце?
Привет, извините за отсутствие ответа. Меня переназначили на что-то другое. Решение состояло в том, чтобы создать вызов WebAPI, который возвращает десериализованный JSON, чтобы сериализация и десериализация выполнялись через Json.NET.
@Julian Не беспокойся :) Бывает. Вы должны добавить свой собственный ответ на случай, если он поможет людям в будущем. Если да, то отметьте меня, чтобы я могла проголосовать :)