【问题标题】:Unremovable Line Breaks in JavaScript stringJavaScript 字符串中不可移除的换行符
【发布时间】:2019-02-20 04:38:42
【问题描述】:

我有一段代码将 JSON 对象序列化为 MVC C# 控制器中的字符串。然后我需要使用这个序列化的 JSON 在前端设置 JavaScript var 的值。

当我尝试将其反序列化回 JSON 对象时,我注意到 JSON.parse 不断中断。经过进一步检查,字符串本身似乎包含换行符(例如 \n、\r)。但是,如果我尝试删除它,代码会显示新行不存在。

这是我尝试过的一些事情:

  • console.log(object.toString().indexOf("\r")); = 这将返回 -1。 \n、\r\n、\t 和 \f
  • 相同
  • console.log(object.toString().indexOf("\\r")); = 同上,加双反斜杠以防万一遗漏。
  • console.log(object.replace(/[\t\r\n\f]/gm, "")); = string 仍然使用相同的字符串输出,包括所有随机换行符。如果我的正则表达式有误,请纠正我。
  • 通过显示字符串中隐藏字符 (http://show-hidden-characters.dostring.com/) 的站点运行此字符串 = 它显示字符串具有行尾 (LF) 字符(例如 "dob":"1970-08-[End of Line(LF) )])
  • 使用 Notepad++ 替换 \r\n = 有效,在字符串中替换了 48 个匹配项。奇怪的是它不适用于代码。
  • 通过 JSON lint 网站 (https://jsonlint.com/) 运行此字符串 = 在有换行符的位置显示无效的 JSON

我用来序列化 JSON 的代码是:

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

我通过 Razor 页面上的脚本标记将其保存到前端,如下所示:

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

我对这个问题束手无策。显然 var 中有一个换行符,但我无法使用代码检测或删除它。 C# 控制器中的原始字符串也使用 json.Replace("\r\n", "").Replace("\n", "").Replace("\r", "") 删除了这些字符,但不知何故,它不断被添加回 JavaScript var 中的相同点。

另一个令人沮丧的地方是,添加这些随机换行符的位置似乎不一致。一种分解出生日期字符串,另一些只是在整个 JSON 对象中的某些键或值之前应用换行符。有人有什么建议吗?

【问题讨论】:

  • “我有一段将 JSON 对象序列化为字符串的代码” - 这将是有用的代码。我不确定您为什么要尝试更改结果字符串,而不是控制字符串的生成方式。
  • 它基本上看起来像这样:converter.Options.HttpPostParameters.Add("object", JsonConvert.SerializeObject(object).Replace("\r\n", "").Replace("\n", "").Replace("\r", "")) 并且在 Razor 前端通过以下方式访问:@HttpContext.Current.Request.Form["object"]
  • 你能把它编辑成你的问题吗?默认情况下,JSON.Net 应该序列化没有任何换行符的值。澄清一下:您是要删除换行符还是转义的换行符?
  • 我正在尝试删除所有换行符,以便可以使用 JSON.parse 将 var 对象成功反序列化回 JSON 对象。

标签: javascript c# json


【解决方案1】:

我不确定默认值是否随时间变化,但 JSON.NET 的当前默认值是 no formatting。如果它不是您的版本中的默认值,您可以手动更改/设置它:

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 中有一些类型缓存功能,因此如果您使用通用实例(即不要在循环中定义它,或者将其定义为使用它的类中的字段),它会更快很多)。

Try it online

【讨论】:

  • 嗨,约翰,谢谢!我试过了,但不幸的是它没有改变任何东西,var 仍然显示相同的损坏 JSON。我想用我当前的输入试试你的小提琴,但看起来我无法尝试,因为我端序列化的 JSON 是通过 Angular API 调用传递的,并且没有转换为任何形式的强类型班级。至少,这似乎是我的猜测。
  • 你不是双重序列化吧?您可以尝试只返回您的对象而不进行序列化吗?或者您能否提供minimal reproducible example 所需的所有内容,以便我可以在最后对其进行测试?
  • 您好,很抱歉没有回复。我被重新分配到别的事情上。解决方案是创建一个返回反序列化 JSON 的 WebAPI 调用,以便通过 Json.NET 完成序列化和反序列化
  • @Julian 不用担心 :) 它发生了。您应该添加自己的答案,以防将来对人们有所帮助。如果你这样做,请标记我,以便我可以投票:)
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
相关资源
最近更新 更多