序列化动态对象时移除转义字符的非字符串替换方案咨询
string.Replace解决? 我在做动态对象的序列化操作,用JsonConvert.SerializeObject序列化ExpandoObject后,调试器里看到的响应是"{\"firstname\":\"prasanthi\",\"lastname\":\"kota\"}",不想用string.Replace或者正则来处理转义符。试过JavaScriptSerializer也会出现带转义的引号,后来用匿名对象加Formatting.Indented得到的是带换行和空格的JSON,也不是我想要的结果。我需要得到没有斜杠、紧凑格式的JSON字符串,求其他解决方案。
首先要澄清一个很容易踩的坑:你在调试器里看到的\"并不是字符串实际包含的内容!调试器为了在字符串字面量中展示双引号,会自动添加转义符,但实际序列化后的字符串本身是标准的JSON,没有多余的转义。你可以通过Console.WriteLine(serialized_info)或者把字符串写入文件来验证,输出的肯定是干净的{"firstname":"prasanthi","lastname":"kota"}。
如果确实遇到了实际字符串中存在转义的情况(大多是因为二次序列化导致的,比如把已经序列化好的字符串又传给了序列化方法),或者你需要确保输出紧凑无格式的JSON,可以试试下面这些方法:
避免重复序列化:如果你的API是直接返回序列化后的字符串,不要把这个字符串再包装一次序列化。比如直接返回对象本身让API框架去处理序列化,而不是先序列化再返回字符串(这样框架可能会把字符串再序列化一次,导致出现转义)。
使用默认的紧凑序列化格式:
JsonConvert.SerializeObject默认就是用Formatting.None,会生成无换行无空格的紧凑JSON。之前你用Formatting.Indented才会得到带换行的格式,去掉这个参数即可:dynamic x = new { firstname = "prasanthi", lastname = "kota" }; var serialized_info = JsonConvert.SerializeObject(x); // 等价于加Formatting.None // 结果就是 {"firstname":"prasanthi","lastname":"kota"}检查序列化上下文:如果你是在某些特殊环境下(比如把JSON字符串嵌入到另一个JSON结构中),那可能需要用专门的嵌套序列化方式,而不是手动处理转义。比如直接把对象作为父对象的属性,而不是先序列化再赋值。
内容的提问来源于stack exchange,提问作者prasanthi

