我有一段代码在MVC C#控制器中将JSON对象序列化为字符串。然后,我需要使用此序列化的JSON在前端设置JavaScript变量的值。
当我尝试将其反序列化回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仍然使用相同的字符串输出,包括所有随机换行符。如果我的正则表达式有误,请纠正我。我用来序列化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变量中的相同点。
另一个令人沮丧的地方是,添加这些随机换行符的位置似乎不一致。一个分解了一个出生日期字符串,另一个简单地在整个JSON对象中的某些键或值之前应用换行符。有人有建议吗?
答案 0 :(得分:0)
我不确定默认值是否随着时间而改变,但是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
中有一些类型缓存功能,因此,如果您使用公共实例(例如,不要在循环中定义它,或将其定义为类中的字段,则可以更快)。它用了很多)。