2015-01-21 152 views
3

当我试图序列化一个包含斜杠/的字符串属性的对象时,JSON生成的每个斜杠都会转义两次。带双转义字符的序列化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(); 
      } 
     } 
    } 
+0

序列化程序执行此操作,但没有关闭它的选项。这是有效的JSON,所以它有一个被逃脱的问题? – 2015-01-21 10:53:55

+0

问题是斜线被转了两次。 – ShuuZ 2015-01-21 10:55:53

回答

1

你看到的JSON像这样在Visual Studio?因为我相信这样可以,但实际值不会有转义字符。 LE:经过测试,你是对的。

我认为一个解决办法可能只是有一个替换的呼叫后弦,像这样:

 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中的客户端'\/' === '/'。所以你不必担心它。

+0

我编辑我的问题更精确。 – ShuuZ 2015-01-21 10:51:34

+0

我已经添加了我的答案。不过这是一个解决方法。 – 2015-01-21 11:04:43

+0

我必须添加这样一个事实,即它自动完成(正斜杠不会被转义)来处理结束标记 - “/>”(我引用 - “HTML不允许