使用双转义字符的序列化JSON

3

当我试图序列化一个包含斜杠/的字符串属性的对象时,生成的JSON会将每个斜杠转义两次。


示例:

一个随机的类:

public class Foo
{ 
    [DataMember(Name = "bar"]
    public string Bar { get; set; }
}

并且

Foo foo = new Foo() { Bar = " Foo / Bar" };
string json = RandomStaticClass.Serialize(foo);

JSON将会是这样的:
{ 
    \"bar\":\"Foo \\/ Bar\"
}

这将导致:

{ 
    "bar":"Foo \/ Bar"
}

虽然我只想要:

{ 
    "bar":"Foo / Bar"
}

这里是我用来序列化对象的函数:

有什么想法吗?谢谢 :)

public static string Serialize(object instance)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(instance.GetType());
            serializer.WriteObject(stream, instance);
            stream.Position = 0;
            using (StreamReader reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
            }
        }
    }

序列化程序会自动处理这个,没有关闭的选项。它生成的是有效的 JSON,所以转义后有问题吗? - Sami Kuhmonen
问题在于斜杠被转义了两次。 - ShuuZ
1个回答

2
你在Visual Studio中是否看到像这样的JSON?因为我认为它是可以的,而实际值将不会有转义字符。
注:已测试,你是正确的。
我认为一个解决方法可能只是在字符串后面调用Replace函数,像这样:
        using (MemoryStream stream = new MemoryStream())
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(instance.GetType());
            serializer.WriteObject(stream, instance);
            stream.Position = 0;
            using (StreamReader reader = new StreamReader(stream))
            {
                return reader.ReadToEnd().Replace("\\", "");
            }
        }

如果有更好的选择,我想知道它是如何处理的。
希望这回答了你的问题。
LLE(仅在您计划在客户端使用JavaScript时):
我必须补充一点,就是这样自动完成的(正斜杠未转义),以处理闭合标签 - /> (我引用 - “HTML 不允许一个</出现在标签内的字符串中”),因为在客户端 JavaScript 中 '\/' === '/'。所以您不必担心它。

我必须补充一点,就是这个操作是自动完成的,也就是说(前斜杠未被转义)要处理闭合标记“/>”(引用原话-“HTML 不允许在 <script> 标签内的字符串中包含 </”),因为在客户端,“/” === “/” 在 JavaScript 中。因此你不必担心它。 - Andrei Olaru
当您删除所有反斜杠时,主要问题在于可能会删除实际上位于原始字符串中的反斜杠。 - ShuuZ
1
但是,我可以通过将 \/ 替换为 / 来限制问题。 - ShuuZ
那也是一个解决方案! - Andrei Olaru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接